CLI and MCP server
Run the content engine from the terminal, or hand it to an AI agent over MCP.
The inkapex command (apps/cli) is a thin layer over the API: every command and every MCP tool is one call through the typed client, and the API decides access on each request. It needs an API key from the dashboard (Settings → API keys); the key is pinned to one organization, so no organization id is ever passed.
export INKAPEX_API_KEY=ik_… # required
export INKAPEX_API_URL=https://api.example.com # optional; default https://api.inkapex.com
npx inkapex --helpMCP server
npx inkapex mcp starts a Model Context Protocol server over stdio. Add it to Claude Desktop, Claude Code, Cursor or any MCP client:
{
"mcpServers": {
"inkapex": {
"command": "npx",
"args": ["-y", "inkapex", "mcp"],
"env": { "INKAPEX_API_KEY": "ik_…" }
}
}
}Options:
--read-onlyregisters only the tools that read (list, get, status, candidates, wins).--toolsets core,keywords,articleslimits the tools to the named groups. Groups:core,knowledge,keywords,articles,linking,citations,backlinks,gsc,improvements.
The tools mirror the dashboard: the site and its settings, business facts and sources, the content plan (add, plan a batch, chat with the keyword strategist), articles (read, edit, publish, refresh, history), link targets, AI citations, the backlink exchange, Search Console status and queries, and the Improvements loop (candidates, inbox, review a proposal section by section, approve, reject, wins). Delete tools carry the destructive annotation; every write is refused when the key lacks the scope.
Hosted MCP endpoint
The API serves the same tools over MCP's Streamable HTTP transport at {API_URL}/api/v1/mcp, so a hosted agent (Claude Desktop, Cursor, a workflow in the cloud) connects without installing anything. The key goes in Authorization: Bearer <key> or X-API-Key; it is verified on each request, and every tool is one call back into the REST API with that key, so the key's scopes decide what the agent may do, exactly as for the CLI.
{
"mcpServers": {
"inkapex": {
"url": "https://api.inkapex.com/api/v1/mcp",
"headers": { "Authorization": "Bearer ik_…" }
}
}
}Claude Code: claude mcp add --transport http inkapex https://api.inkapex.com/api/v1/mcp --header "Authorization: Bearer ik_…".
The endpoint is stateless (no session id; each POST carries one JSON-RPC request and is answered as JSON), so it needs no sticky sessions behind a load balancer. GET and DELETE answer 405: there is no server-initiated stream and no session to close. MCP_HTTP_ENABLED=false on the API turns it off. Signing in with OAuth instead of a key is not built yet.
The tools themselves live in packages/engine-tools (@makev1/engine-tools), one definition per API call with its toolset and read-only flag; the stdio server in apps/cli and the hosted endpoint in apps/api/src/modules/mcp both register that list. Add a tool there and both get it.
Commands
inkapex site
inkapex keywords --scope scheduled
inkapex keywords add "cheap widgets for teams" --on 2026-12-01
inkapex keywords plan --count 20 --playbook comparison
inkapex articles --status draft
inkapex articles get <id> | jq -r .markdown > draft.md
inkapex articles publish <id>
inkapex improvements --status awaiting_review
inkapex improvements approve <id>
inkapex winsOutput is JSON, one object or array per command, so it composes with jq and scripts. Errors print the API's code and message on stderr and exit 1.
Building and publishing
pnpm --filter @makev1/cli build bundles one ESM file with the shebang and the client inside, so npx needs nothing else. Publish it under the product's npm name with the bin entry; the package in the repository is private.