Dextalo MCP connector
Connect Claude, ChatGPT, Claude Code, Grok and other MCP clients to your company wiki. The connector lets an assistant search, read, draft, publish and restore Knowledge pages — always as you, with your permissions, and with every write audited.
Last updated: 9 September 2026
Dextalo exposes a remote Model Context Protocol (MCP) server for the Knowledge app. Any MCP-aware assistant can be pointed at it and will see a small set of well-described tools for working with wiki pages. The server is stateless and speaks MCP Streamable HTTP, so it works with hosted clients (Claude, ChatGPT, Grok) as well as local ones (Claude Code, Cursor, and anything that can send an HTTP header).
| Server URL | https://dextalo.com/api/mcp/knowledge |
| Transport | MCP Streamable HTTP (JSON responses; POST only) |
| Authentication | Sign in with your Dextalo account (OAuth 2.1 — Claude, ChatGPT, Claude Code and other clients that support MCP sign-in), or a personal access token sent as Authorization: Bearer dxk_… (Grok, curl, scripts) |
| Scope | The Knowledge app (wiki pages). Projects, HRM and Accounting tools are planned. |
| Identity | The connection acts as you — same workspace, role and permissions as in the app. A token acts as the person who created it. |
1. Claude (web, desktop and Cowork)
Claude adds remote MCP servers as custom connectors. A connector added once is available in claude.ai, the Claude desktop app, Cowork and the mobile apps, and can be switched on per conversation from the “+” menu → Connectors. Dextalo supports Claude's standard OAuth sign-in, so there is no token to create or paste.
Free, Pro and Max
- Go to Customize → Connectors and click Add custom connector.
- Name it “Dextalo” and enter the server URL
https://dextalo.com/api/mcp/knowledge, then click Continue. Claude checks the server and detects that sign-in is required. - Leave Authentication on the detected option (“Always required”). For the OAuth client, choose “No client ID — register one automatically”: Dextalo supports Dynamic Client Registration, so Claude registers itself. Do not add request headers.
- Click Add, then Connect. A browser window opens Dextalo: sign in if you are not already, review what the connector will be able to do, and click Allow.
- You are sent back to Claude. Enable the connector in a chat and ask: “List the pages in our wiki.”
Team and Enterprise (an owner sets it up)
- Go to Organization settings → Connectors and click Add, then Custom.
- Name it “Dextalo” and enter
https://dextalo.com/api/mcp/knowledge. Keep the detected OAuth authentication and the automatic OAuth client. - Click Add. Each member then opens Customize → Connectors, clicks Connect on Dextalo, and signs in with their own account — so every page change is attributed to the person who made it.
Tool permissions
After adding the connector, open it under Customize → Connectors to set a permission per tool. We recommend Allow for the read tools (list, get, search, history, revision) and Ask for the writing tools, so you confirm each change before it lands. Dextalo re-checks your permissions on every call either way.
2. ChatGPT
ChatGPT's custom MCP connectors (Settings → Apps & Connectors, with Developer mode enabled) support OAuth sign-in, which is exactly what Dextalo offers.
- Open Settings → Apps & Connectors → Create (Developer mode must be on).
- Name it “Dextalo”, enter
https://dextalo.com/api/mcp/knowledgeas the MCP server URL, and set Authentication to OAuth. Leave the client ID and secret empty — ChatGPT registers itself. - Click Create, then Connect. Sign in to Dextalo in the browser window, click Allow, and you are returned to ChatGPT.
- Enable the connector in a conversation and ask it to search the wiki.
3. Personal access tokens (Grok, scripts, header-only clients)
Clients that send a fixed header with every request instead of signing in use a personal access token. Tokens are created in the Knowledge app and are tied to your user account. You need the permission to edit pages (knowledge_page:update) or to manage the Knowledge app to create one.
- Open Dextalo and go to Knowledge → Settings.
- Under Personal access tokens, give the token a name (for example “Claude Code on my laptop”) and pick an expiry: 30, 90 or 365 days. Only Knowledge managers can create tokens that never expire.
- Click Create token. The full secret (
dxk_…) is shown once — copy it now. Dextalo only stores a hash and cannot show it again. - Paste it into your client as described below. If you lose it, revoke it and create a new one.
Good to know
- A token can never do more than you can in the app. If your role is read-only, the assistant only sees the read tools.
- Each user can hold up to 25 live tokens. Revoked tokens stay listed (greyed out) for the audit trail.
- Knowledge managers can see and revoke every token in the workspace. Everyone else sees only their own.
- Tokens cannot be created while “Simulate user” is active.
- When your account is deactivated or you leave the workspace, all of your tokens — and your OAuth connections — stop working immediately.
4. Claude Code
Claude Code's HTTP transport discovers the sign-in from the URL and registers itself, so no token is needed — add the server, then run /mcp in a session and authenticate in the browser that opens:
claude mcp add --transport http dextalo-knowledge https://dextalo.com/api/mcp/knowledgeIf you would rather use a fixed header — an unattended agent, or a machine with no browser — add a personal token instead:
claude mcp add --transport http dextalo-knowledge https://dextalo.com/api/mcp/knowledge \
--header "Authorization: Bearer dxk_…"Add --scope user to make the server available in every project instead of just the current folder. Run claude mcp list to check it connected, and /mcp inside a session to see the tools. The same settings block works for the project-level .mcp.json file if you prefer to keep it in the repository (without the token — reference an environment variable instead, as in the example):
{
"mcpServers": {
"dextalo-knowledge": {
"type": "http",
"url": "https://dextalo.com/api/mcp/knowledge",
"headers": { "Authorization": "Bearer ${DEXTALO_TOKEN}" }
}
}
}5. Grok
Grok's custom connectors accept a server URL plus an authorization value, so the personal token works directly. (Grok's OAuth form asks for a Client ID rather than registering itself, which Dextalo does not support yet.)
- Open grok.com/connectors and click New Connector, then Custom.
- Name it “Dextalo Knowledge”.
- Server URL:
https://dextalo.com/api/mcp/knowledge. - In the authentication field enter
Bearer dxk_…as the Authorization header value. - Save the connector and ask Grok what it can see in the wiki.
6. Cursor, VS Code and other clients
Any client that supports the MCP Streamable HTTP transport can connect. Clients that implement MCP's OAuth sign-in (MCP Inspector, recent Cursor and VS Code builds) can simply be pointed at the URL; otherwise use a personal token in the same JSON shape as for Claude Code:
{
"mcpServers": {
"dextalo-knowledge": {
"url": "https://dextalo.com/api/mcp/knowledge",
"headers": { "Authorization": "Bearer dxk_…" }
}
}
}- Cursor: Settings → MCP → Add new global MCP server, then paste the block above.
- VS Code (Copilot agent mode): add the server to
.vscode/mcp.jsonwith"type": "http". - Windsurf, Zed, Cline and similar: use their remote/HTTP server option with the same URL and header.
- Clients that only support the older SSE transport (a
GETthat opens a stream) are not supported — Dextalo answers405toGET.
Quick check with curl
curl -s https://dextalo.com/api/mcp/knowledge \
-H "Authorization: Bearer dxk_…" \
-H "Content-Type: application/json" -H "Accept: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'7. Tool reference
All tools are prefixed knowledge_. Page bodies are exchanged as Markdown: headings, lists, task lists, tables, code fences, links, images, callouts and toggles round-trip; text colours do not. Every tool returns a human-readable text block plus a structuredContent.data object with the same information in snake_case, and every write also returns an audit_id.
A tool is only listed to a client when the token's role holds the permission in the last column. A tool the role cannot use is reported as unknown.
Reading
| Tool | What it does | Inputs | Permission |
|---|---|---|---|
knowledge_page_list | Every live page as a flat list with parent_id, rendered as an indented tree. Includes never-published pages and pages with a pending draft. | none | knowledge_page:read |
knowledge_page_get | One page as Markdown plus metadata (slug, breadcrumbs, revision_count, published revision, who updated it). version: "draft" returns the pending draft when one exists. | slug or id; version (published | draft) | knowledge_page:read |
knowledge_page_search | Full-text search over published titles and bodies. Ranked hits with an excerpt. Drafts are not searchable. | query (2–200 chars); limit (1–50, default 20) | knowledge_page:read |
knowledge_page_history | A page's revisions, newest first: number, kind (draft / publish / revert), title, note, author, time. | id; limit (default 20) | knowledge_page:read |
knowledge_page_revision_get | One historical revision as Markdown. | id; revision_no | knowledge_page:read |
Writing
| Tool | What it does | Inputs | Permission |
|---|---|---|---|
knowledge_page_create | Create a page from Markdown. Saved as a draft unless publish: true. The slug is derived from the title when omitted and made unique. | title; markdown; optional parent_id, slug, publish, note | knowledge_page:create (+ :update to publish) |
knowledge_page_update | Replace a page's body (and optionally title). mode: "draft" saves a pending draft that readers do not see; mode: "publish" makes it live. Fails with conflict if the page changed since you read it. | id; markdown; mode; expected_revision_count (from knowledge_page_get); optional title, note | knowledge_page:update |
Destructive (preview first, then confirm)
| Tool | What it does | Inputs | Permission |
|---|---|---|---|
knowledge_page_revert | Restore an older revision as the current content. History is kept — a new revert revision is appended. | id; revision_no; confirm; confirm_token; expected_revision_count (required to confirm); optional note | knowledge_page:update |
knowledge_page_trash | Move a page and all of its sub-pages to the trash. Recoverable with restore. | id; confirm; confirm_token | knowledge_page:delete |
knowledge_page_list_trash | Pages currently in the trash, most recently deleted first. | none | knowledge_page:delete |
knowledge_page_restore | Bring a trashed page (and the sub-pages trashed with it) back. Re-parents to the root when the original parent is gone. | id; confirm; confirm_token | knowledge_page:delete |
Not available over MCP (app only): permanently deleting from the trash, renaming or moving pages, discarding a draft, managing tokens, and role administration.
8. How the assistant works with pages
Drafts and publishing
Every page has a published version and, optionally, a pending draft. Creating a page or updating it in draft mode is invisible to readers until it is published; search only covers published content. Ask the assistant to “save as draft” when you want to review in the app before it goes live, or “publish” to make it immediately visible.
Confirmation for destructive actions
Revert, trash and restore never act on the first call. Without confirm they return a preview (what would be restored, or which sub-pages would be trashed) together with a confirm_token bound to the page's current state. The assistant is instructed to show you the preview and only re-call with confirm: true and that token after you agree. If the page changes in between, the token no longer matches and the call is rejected.
Nobody's work gets overwritten
Updates and confirmed reverts require expected_revision_count, the count the assistant last read. If someone edited the page in the meantime the call fails with a conflict error and nothing is written; the assistant re-reads and applies its change again.
History
Every draft save, publish and revert appends a numbered revision with the author and an optional note. Nothing is rewritten, so the app's History view shows the assistant's changes next to everyone else's.
Resources
Besides tools, the server lists every published page as an MCP resource at knowledge://pages/{slug} with text/markdown content. Clients that support resources can attach a page to a conversation without calling a tool.
9. Security and audit
- OAuth connections use the standard Authorization Code flow with PKCE. The sign-in happens on dextalo.com — the client never sees your password — and what the client receives is a short-lived access token that names only your Dextalo account and workspace.
- Tokens are stored as a keyed hash; the secret is shown once and never stored in clear.
- Every request is authenticated on its own. There is no browser cookie fallback, so a web page cannot call the endpoint as a signed-in user.
- The workspace is derived from the credential, never from a tool input. A token or connection is pinned to the workspace it was created in.
- Every OAuth connection is recorded in the workspace audit log (who connected which client, and when), and each request it makes is marked as coming through that client.
- Permissions are checked three times: when listing tools, when calling a tool, and again inside the service that performs the change.
- Every write is recorded in the workspace audit log with the acting user and a marker that it came through a token, and the
audit_idis returned to the client. - Page bodies are sanitised on the way in exactly like editor input: allow-listed formatting only,
http(s)links and images, 256 KiB per page. - Requests from browsers with an unknown
Originare refused; non-browser clients are unaffected. - Expected failures (validation, not found, conflict, missing permission) are returned to the assistant as readable tool errors. Unexpected failures are logged server-side and never leak details.
10. Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
401 Unauthorized | Missing, mistyped, expired or revoked token; an OAuth connection whose sign-in lapsed; or your account was deactivated. | For a token, check the header reads Authorization: Bearer dxk_… (with the word Bearer) and create a new one if it expired. For a connector, click Connect again. |
| Connect opens Dextalo but ends on an error page | The authorization request expired (10 minutes), or was started from a different account than the one that signed in. | Go back to the client and click Connect again; make sure you sign in with the account you want the connector to act as. |
403 Forbidden origin | The request carried a browser Origin header that is not dextalo.com. | Call from a client, not from a web page. Local tools on localhost are allowed. |
405 Method Not Allowed | The client opened a GET (legacy SSE transport) or DELETE. | Select the Streamable HTTP transport; the URL must not end in /sse. |
| The assistant sees only read tools | Your role lacks create / update / delete permissions for Knowledge. | Ask a workspace admin to adjust your role. The token cannot be broader than you. |
conflict: … on update | The page changed since it was read. | Read it again with knowledge_page_get and retry with the new expected_revision_count. |
validation_error: confirm_token … | confirm: true was sent without the token from the preview, or the page changed since the preview. | Call without confirm to get a fresh preview, then confirm with the returned token. |
| Claude says it couldn't register with Dextalo's sign-in service | The connector was created with a manual OAuth client ID or with request headers left over from an older setup. | Remove the connector and add it again with the detected authentication and the automatic OAuth client, and no request headers. |
11. Protocol details
For developers integrating directly rather than through an off-the-shelf client.
- One JSON-RPC 2.0 message per
POST. Batch arrays are rejected with-32600. - Responses are
application/json. If theAcceptheader lists onlytext/event-stream, the same single response is wrapped as one SSEmessageevent and the stream closes. - Notifications (
notifications/initialized,notifications/cancelled) are acknowledged with202and an empty body. - Protocol versions
2025-06-18,2025-03-26and2024-11-05are negotiated; the client'sMCP-Protocol-Versionheader is echoed back. - Methods:
initialize,ping,tools/list,tools/call,resources/list,resources/templates/list,resources/read,prompts/list(empty). Anything else answers-32601. - Error codes:
-32001unauthorized,-32002resource not found,-32003forbidden, plus the standard JSON-RPC codes. - Server identity:
serverInfo.nameisdextalo-knowledge. Theinitializeresult carries aninstructionsstring that explains drafts, publishing and the confirm flow to the model. - Request bodies are capped at 2 MiB; a page body at 256 KiB.
Dextalo