genko.me
Official remote MCP server for genko.me, a headless CMS. Search the docs, then read, draft, publish, and schedule entries in your workspaces. OAuth sign-in.
Hosted MCP Server
npx add-mcp 'https://genko.me/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
MCP server (/en/ai/mcp)
How to connect with OAuth to search the documentation and manage content.
At https://genko.me/mcp we provide an MCP server for searching the documentation and managing workspace content. It uses Streamable HTTP. You sign in to genko.me from your AI client with OAuth.
To let an AI read the public documentation without an account, use llms.txt and Markdown. The old https://docs.genko.me/mcp has been retired.
Register it in your AI client [#register-it-in-your-ai-client]
In your client's MCP settings, register the server name genko-me and the URL https://genko.me/mcp. After you save, reload the connection and approve it on the OAuth sign-in screen. You need a Streamable HTTP MCP client that supports OAuth.
The CLI can add or update the setting that fits your client. It also replaces entries under the older names genko.me, genko, and genko-docs.
npx @genko-me/cli@latest mcp --claude-code
npx @genko-me/cli@latest mcp --cursor
npx @genko-me/cli@latest mcp --vscode
npx @genko-me/cli@latest mcp --codex
--codex updates your user-wide settings. If you don't use the CLI, register it manually in the formats below.
| Client | Where the setting goes |
|---|---|
| Claude Code | The project's .mcp.json |
| Cursor | The project's .cursor/mcp.json |
| VS Code | The project's .vscode/mcp.json (under the servers key) |
| Codex | User-wide ~/.codex/config.toml |
Here is an example .mcp.json for Claude Code.
{
"mcpServers": {
"genko-me": {
"type": "http",
"url": "https://genko.me/mcp"
}
}
}
For Codex, add this to ~/.codex/config.toml.
[mcp_servers.genko-me]
url = "https://genko.me/mcp"
If you set it up by hand, delete any entries under the older names genko.me, genko, or genko-docs. The format differs by client, so check the location and key in the table above.
Available tools [#available-tools]
| Tool | Arguments | Result |
|---|---|---|
search_docs | query: a non-empty search term; optional lang (ja or en, inferred from the query when omitted) | Titles, URLs, and excerpts of related pages |
get_doc | path: a page path or a full URL | The page body as Markdown |
list_workspaces | None | Your workspaces and roles |
list_apis | workspace | API and field definitions, the workspace's languages, and each API's multilingual setting |
list_entries | workspace, api; optional status, limit, offset | The main-language entry list, the status of language versions that exist, and whether there are unpublished changes |
get_entry | workspace, api, id; optional lang | The entry and its language versions, rich text as Markdown, and unpublished changes |
create_draft | workspace, api, values; optional id | Creates a draft |
update_draft | workspace, api, id, values; optional lang | Updates a draft. On a published version, it saves the change as an unpublished change. For a language version that doesn't exist yet, it creates one from the main language |
begin_draft_edit | workspace, api, id, fieldId, pendingBlocks | Starts the editing indicator in the editor and returns an edit token |
append_draft_block | workspace, api, id, editToken, markdown | Saves one Markdown block and removes one line from the editing indicator |
finish_draft_edit | workspace, api, id, editToken | Ends the editing indicator |
publish_entry | workspace, api, id; optional lang | Publishes a draft or scheduled version right away, or publishes the unpublished changes of a published version |
discard_changes | workspace, api, id; optional lang | Discards the unpublished changes of a published version |
schedule_entry | workspace, api, id, scheduledAt; optional lang | Schedules the given language version |
For example, pass {"query":"scheduled publishing"} to search_docs, then give the page it finds as the path of get_doc.
{ "path": "/guides/scheduled-publishing" }
Search with short feature names, and fetch the page body instead of judging by the excerpt alone. Working with content requires permission in the workspace. Publishing and scheduling ask for an additional OAuth permission.
To show the AI's progress in the editor, call begin_draft_edit with the ID of the rich text field, save each paragraph with append_draft_block, then call finish_draft_edit. Saved paragraphs appear in the editor, and paragraphs not yet saved show as skeletons. update_draft still updates everything at once and shows no editing indicator.
Using update_draft on a published entry saves only the fields you pass as unpublished changes. If you update again, the change builds on those unpublished contents. Your site and the regular delivery API keep showing the published content. In get_entry, hasPendingChanges is true, values and markdown hold the unpublished contents, and published.values and published.markdown hold the current published contents. You can also check hasPendingChanges in list_entries. Publish with publish_entry, or discard with discard_changes. These also work on a language version you name with lang.
begin_draft_edit, append_draft_block, and finish_draft_edit are for drafts only. For unpublished changes on a published entry, use update_draft.
Manage language versions from MCP [#manage-language-versions-from-mcp]
Check the workspace's languages in languages.main and languages.subs of list_apis, and confirm the target API has localized: true. If you omit lang or pass the main language, you work on the main language as before. An additional-language lang works with get_entry, update_draft, publish_entry, discard_changes, and schedule_entry. Filtering list_entries by status applies to the main language, and each row's languages returns the versions that exist, their status, and hasPendingChanges.
{
"workspace": "your-workspace",
"api": "blog",
"id": "abcDEF123456",
"lang": "en",
"values": { "title": "First article" }
}
If the language version you name doesn't exist, update_draft copies the main language's current values as a draft and applies the field values you pass. It validates the values and storage first, and creates no language version if that fails. If the language version is a draft, it updates its contents, and if it's published, it saves the change as that language version's unpublished change. publish_entry and schedule_entry don't create versions automatically, so prepare a draft first. The version history records the save from MCP and the language, and the contents and publish status of the main language and the other languages don't change.
get_entry also reads unpublished versions and returns the language versions that exist, with their status, in languages. An unknown language, an additional language on an API that isn't multilingual, and a version that doesn't exist are errors. Reading requires membership in the workspace. Updating requires the Editor role or higher and mcp:write, and publishing and scheduling also require mcp:publish. The in-editor progress display from begin_draft_edit, append_draft_block, and finish_draft_edit edits only the main-language draft.
Check the connection [#check-the-connection]
Confirm that your AI client shows the genko-me tools, then ask it to "search for how to manage genko.me API keys". If it can fetch the body of a page from the search results, you're connected.
If the tools don't show up, check where the settings file is saved, reload the client, and make sure the URL ends in /mcp. If your network restricts connections, you can also use Read as Markdown.