Heeft je agent een shell, geef hem dan een command line
MCP of CLI voor AI-agents komt neer op één vraag: heeft de agent een shell? Zo ja, zoals in Claude Code, Codex of Cursor, dan is een goed gebouwde command line meestal de betere interface. Hij laadt alleen wat de agent nodig heeft, hij combineert met al het andere in de shell, en je kunt elk commando zelf uitvoeren. Heeft de agent geen shell, zoals in een chatapp, dan is MCP de ingang. Wij hebben de agenttoegang van Time Momentum gebouwd als command line, tm, en bewust gekozen tegen een MCP-server. Deze gids legt uit waarom, en waar die keuze verkeerd zou zijn.
Wat MCP is
Het Model Context Protocol is, in eigen woorden, „an open-source standard for connecting AI applications to external systems” (modelcontextprotocol.io). Het project vergelijkt het met een USB-C-poort: één stekker voor veel apparaten.
De huidige specificatie, versie 2026-07-28, definieert hosts (de AI-applicatie), clients (de connectors daarin) en servers (de diensten die gegevens en tools leveren), die via JSON-RPC communiceren. Een server kan resources, prompts en tools aanbieden. Tools gebruiken agents het meest: de client vraagt de server met tools/list om zijn lijst, en elke tool komt met een naam, een beschrijving en een JSON Schema voor de invoer.
CLI-design voor AI-agents: wat een command line agentvriendelijk maakt
Een command line is niet vanzelf goed voor agents. Hij heeft een paar eigenschappen nodig waar mensen zelden om vragen:
- Hij beschrijft zichzelf als data:
--helpen een volledige commandocatalogus als JSON, zodat de agent nooit naar flags hoeft te raden. - Uitvoer is een contract: met
--jsonprecies één JSON-document op stdout, fouten als JSON op stderr. - Exitcodes hebben betekenis: aanroep verbeteren, de mens vragen, wachten, opnieuw proberen. Eén getal vertelt de agent wat hij daarna moet doen.
- Hij wacht nooit op invoer die de agent niet kan geven: zonder terminal vraagt niets iets na. Destructieve stappen hebben een uitdrukkelijke flag nodig, zoals
--yes. - Hij kan tonen in plaats van handelen:
--dry-rundrukt het exacte verzoek af zonder het te versturen. - Geheimen blijven buiten de uitvoer, ook met
--verboseen--dry-run, want wat de agent ziet, belandt in zijn context. - Hij is makkelijk te installeren overal waar een agent draait, liefst zonder afhankelijkhedenboom.
MCP of CLI voor AI-agents in één oogopslag
| Vraag | MCP-server | Agentvriendelijke CLI |
|---|---|---|
| Context verbruikt vóór de eerste aanroep | deelsVaak elke definitie | Alleen op verzoek |
| Resultaten combineren zonder het model | –Via het model | Pipes, jq, scripts |
| Je kunt herhalen wat de agent deed | deelsInspector | Zelfde commando |
| Versie kan worden vastgezet | deelsServer beslist | |
| Werkt in agents met een shell | deelsAls de client het ondersteunt | |
| Werkt in chatapps zonder shell | – | |
| Standaard vindbaarheid en aanmelding | tools/list, OAuth | –Eigen conventie |
Stand: 10 okt 2026
Context: definities vooraf of op verzoek
Het engineeringteam van Anthropic beschreef het probleem in november 2025: „Most MCP clients load all tool definitions upfront directly into context”, en die beschrijvingen verhogen responstijd en kosten (Code execution with MCP). Hun advies: laat het model tooldefinities op verzoek lezen.
Eerlijk is eerlijk: clients halen hun achterstand in. Claude Code stelt MCP-tools nu standaard uit: bij de start van een sessie laden alleen toolnamen en serverinstructies, en de volledige definitie volgt als Claude naar de tool zoekt (MCP tool search). Andere clients laden mogelijk nog alles.
Een CLI laadt vanzelf op verzoek, want er staat niets in de context totdat de agent een commando uitvoert. We hebben gemeten hoeveel er te laden valt in tm 0.3.0: de volledige catalogus (tm schema --json) is 377.203 tekens, het overzicht van alle commandogroepen (tm --json) 32.110, de groep facturen 104.009. Een afzonderlijk commando heeft een mediaan van 934 tekens over 157 commando's. Methode: npx -y @time-momentum/cli@0.3.0 schema --json | wc -c en hetzelfde voor de andere aanroepen, op 10 okt 2026.
De catalogus is niet klein. Daar gaat het juist om: de agent bepaalt wat hij laadt, meestal één groep of één commando.
Combineerbaarheid: pipes, jq en scripts
Bij MCP geldt: „every intermediate result must pass through the model”, zoals hetzelfde artikel van Anthropic het zegt. Een lijst van 500 facturen die de agent alleen hoeft te tellen, belandt toch in zijn context.
In een shell filtert de agent voordat hij leest. tm payments outstanding --json | jq '[.data[].summary.outstanding_micros] | add / 1000000' geeft één getal terug: het openstaande totaal in euro. tm invoices list --all --json | jq '[.data[] | select(.status == "draft")] | length' telt concepten over alle pagina's. Dezelfde regels werken in een cronjob of een shellscript, zonder agent.
Authenticatie: OAuth of API-sleutel
In MCP is autorisatie optioneel. Remote servers via HTTP horen de OAuth 2.1-flow uit de specificatie te volgen; lokale servers via stdio halen hun inloggegevens uit de omgeving. Voor een chatapp waarin elke gebruiker zich met een eigen account aanmeldt, is OAuth de comfortabelere optie.
Een CLI werkt meestal met een API-sleutel. Dat is eenvoudig, maar vraagt zorg: de sleutel mag nooit opduiken in wat de agent leest. tm bewaart hem in een lokaal bestand met modus 600 of een omgevingsvariabele, wisselt een schrijfsleutel in voor een token dat één uur geldig is en drukt de sleutel nooit af, ook niet met --verbose of --dry-run. Een token uit die inwisseling kan geen nieuwe sleutels aanmaken en het account niet verwijderen.
Testbaarheid: proefrun en hetzelfde commando voor jou
Elke aanroep die een agent via een CLI doet, is een regel die je kunt kopiëren, lezen en zelf uitvoeren. --dry-run gaat nog een stap verder en toont methode, URL en body zonder iets te versturen. Zo is het werk van de agent te controleren voordat het gebeurt, en dat telt het meest bij facturen.
Ook MCP heeft hier hulpmiddelen voor, zoals de MCP Inspector voor developers. Maar een toolaanroep typ je niet in je eigen terminal om te zien wat er gebeurt.
Versiebeheer: vastzetten of laten meebewegen
Een CLI is een pakket met een versie. Je kunt hem vastzetten (npx -y @time-momentum/cli@0.3.0), terugzetten (tm update --to <version>) en weten dat een script dat gisteren werkte, vandaag werkt. Verandert de API zo dat een oude versie het fout zou doen, dan weigert de server die versie met een duidelijke fout en het updatecommando.
MCP versioneert het protocol op datum en laat servers wijzigingen in hun toollijst tijdens het draaien aankondigen. Een remote server bepaalt zelf welke tools je vandaag krijgt. Dat is handig zolang er niets breekt.
Bereik: elke agent met een shell
Claude Code, Codex, Cursor en de meeste coding agents kunnen shellcommando's uitvoeren. Een CLI werkt in al die agents zonder dat de client iets anders hoeft te ondersteunen, ook in sandboxes en CI.
Waar MCP de betere keuze is
- Clients zonder shell. claude.ai, Claude Desktop en de mobiele Claude-apps bereiken externe tools via connectors, en dat zijn MCP-servers (Claude docs). Een CLI helpt daar niet.
- Standaard vindbaarheid. Elke MCP-server beantwoordt
tools/listop dezelfde manier, en de officiële MCP Registry somt servers op. Elke CLI documenteert zichzelf op zijn eigen manier. - Aanmelding per gebruiker. Met OAuth koppelt iedereen zijn eigen account zonder met een sleutel te hoeven werken.
- Niet-technische gebruikers. Een connector toevoegen in een chatapp is makkelijker dan een command line installeren.
Hoe Time Momentum het doet
De agents van onze gebruikers werken al in een shell, aan klantprojecten. Daarom heeft Time Momentum geen MCP-server. Het heeft tm, een command line die het hele product bedient: inzet, klanten, opdrachten, projecten, facturen en e-facturen, betalingen, urenverantwoordingen en rentabiliteit.
tm heeft geen runtime-afhankelijkheden. Elke operatie van de REST-API die voor de command line bedoeld is, heeft precies één commando, 143 operaties in versie 0.3.0, en een test dwingt dat af bij elke API-wijziging. tm skill geeft de gebruikshandleiding die bij de geïnstalleerde versie hoort. In Claude Code voegt tm skill --install een korte skill toe die ernaar verwijst, en Time Momentum is ook beschikbaar als Claude Code-plugin.
Een factuur definitief maken of crediteren en verwijderen vragen een uitdrukkelijke --yes. Zonder terminal stopt tm anders.
Meer over dit onderwerp
Voor AI-agents
Wat je agent in Time Momentum kan via
Voor AI-agentstm, het beveiligingsmodel en hoe je het inricht.Bedrijfssoftware voor AI-agents
Zo zie je of software je agent veilig laat werken met klanten, facturen en betalingen.
Gids lezen
Laat je agent de facturatie vanuit de shell doen
- 30 dagen Pro
- Geen creditcard
- Daarna verder met Free
Veelgestelde vragen
Is een CLI of een MCP-server beter voor AI-agents?
Voor agents met een shell, zoals Claude Code, Codex of Cursor, is een goed gebouwde CLI meestal beter: hij laadt alleen waar de agent om vraagt, resultaten kunnen met pipes worden gefilterd voordat het model ze leest, en je kunt elke aanroep zelf herhalen. Voor chatapps zonder shell is MCP de enige optie.
Verbruiken MCP-tooldefinities het contextvenster?
In veel clients wel: Anthropic schreef in november 2025 dat de meeste MCP-clients alle tooldefinities vooraf laden. Claude Code stelt ze nu standaard uit en laadt bij de start alleen toolnamen.
Wat maakt een CLI agentvriendelijk?
Een machineleesbare commandocatalogus, precies één JSON-document per aanroep, fouten als JSON, betekenisvolle exitcodes, geen interactieve vragen zonder terminal, een uitdrukkelijke bevestigingsflag voor destructieve stappen, een proefrun en geen geheimen in de uitvoer.
Heeft Time Momentum een MCP-server?
Nee. Agents gebruiken de command line tm, die elke daarvoor bedoelde API-operatie dekt. Claude Code krijgt daarnaast een skill en een plugin.