Connect an AI agent
Create and edit prompts, skills and blog drafts from your agent. Prompt and skill submissions go to human review; the final blog publish happens in the dashboard.
In this guide
Quick start
The server URL:
https://www.promptdock.ai/mcpIn a terminal, add it to Claude Code:
claude mcp add -s user --transport http --client-id a1b7de6e-807d-4374-b533-7b9163f357a9 --callback-port 8765 promptdock https://www.promptdock.ai/mcp- Then
/mcp→ Authenticate, approve in the browser, and paste the sentence under step 5.
Before you start
You need a Prompt Dock account; sign up first. Signing up adds an email confirmation, so finish it before you connect an agent: the agent waits on the browser while you do.
Prompts and skills submitted by members are reviewed by a person before they go live.
The server URL
One URL for every client. It speaks Streamable HTTP and signs you in with OAuth in your browser.
https://www.promptdock.ai/mcpClaude Code
Checked with Claude Code 2.1.179.
1. Add the server
claude mcp add -s user --transport http --client-id a1b7de6e-807d-4374-b533-7b9163f357a9 --callback-port 8765 promptdock https://www.promptdock.ai/mcp-s useradds it for every folder. Without it Claude Code adds it to the current folder only.If you prefer the client to register itself
claude mcp add -s user --transport http promptdock https://www.promptdock.ai/mcpWith this command the approval page labels the app Unverified app: it registered itself, so Prompt Dock can't confirm who made it. That is expected for the real client too. Check that the name and the computer are yours before you approve.
2. Authenticate
In Claude Code, run
/mcp, choosepromptdock, then Authenticate. Your browser opens Prompt Dock's approval page; sign in if it asks.3. Choose what it can do
Pick Create, edit and submit if you want it to submit for review; you can change this later in Settings → Account → Connected apps. Then approve.
4. Confirm
Back in Claude Code, run
/mcp: the server shows Connected.5. Make the first call
Paste this into Claude Code:
Create a draft prompt titled "MCP connection test" with the body "Say hello to {{name}}." and give me its dashboard link.Expect a reply with a link to your dashboard, where a draft named MCP connection test now sits. If anything fails, ask it to run
whoami: the answer names the account and the level it connected with.
Codex
Checked with Codex 0.161.0.
1. Add the server
codex mcp add promptdock --url https://www.promptdock.ai/mcp --oauth-client-id 3cb8ebcd-7bcc-4752-a1a1-4ce99d0763ccThis client signs in on port 8766, which Codex reads from
~/.codex/config.toml. Add the port line at the top of the file:~/.codex/config.toml
# ~/.codex/config.toml # A top-level key: keep it above every [table] in the file. mcp_oauth_callback_port = 8766 [mcp_servers.promptdock] # Written by `codex mcp add`; leave its lines as they are. url = "https://www.promptdock.ai/mcp"If you prefer the client to register itself
codex mcp add promptdock --url https://www.promptdock.ai/mcpThis form needs no port line.
With this command the approval page labels the app Unverified app: it registered itself, so Prompt Dock can't confirm who made it. That is expected for the real client too. Check that the name and the computer are yours before you approve.
2. Authenticate
codex mcp login promptdockYour browser opens Prompt Dock's approval page; sign in if it asks.
3. Choose what it can do
Pick Create, edit and submit if you want it to submit for review; you can change this later in Settings → Account → Connected apps. Then approve.
4. Confirm
Start Codex and run
/mcp:promptdockis listed with its tools.5. Make the first call
Paste the same sentence as Claude Code's step 5, and expect the same reply: a link to a draft in your dashboard.
Other clients
Use a client that supports Streamable HTTP and OAuth. Desktop clients send no Origin header and work; hosted browser clients need an allowed origin. Configuration fields vary by client.
Claude Code's project-shared .mcp.json form
{
"mcpServers": {
"promptdock": {
"type": "http",
"url": "https://www.promptdock.ai/mcp"
}
}
}Claude on the web and the Claude desktop app add it as a custom connector: Settings → Connectors → Add custom connector. Paste https://www.promptdock.ai/mcp as the server URL and name it Prompt Dock. Under Advanced settings, paste aa8c5f93-134d-4713-b304-518dda52d3c1 as the OAuth Client ID and leave the OAuth Client Secret blank.
Today only an MCP client can sign in and get a token: there is no device flow and no promptdock token command yet, so a script cannot call the server on its own.
Sign in and re-authenticate
Signing in opens Prompt Dock's approval page in your browser. That page is where you choose what the app can do:
- Create and edit (preselected): create and edit your prompts, skills and blog posts as drafts or unlisted, read everything of yours, and reveal public prompts and install skills under your plan's limits.
- Create, edit and submit: all of that, and submit prompts and skills for review. It is the level you need to submit.
Both levels can do things you may not expect: an unlisted item is reachable by its link; changing a published prompt's access, visibility or output applies at once; an uploaded image is public by URL the moment it lands; and a premium reveal or a completed install counts exactly as it would in the dashboard.
The app works only through Prompt Dock's own server: its token can't write to the database or to storage directly, so the level you chose is the whole of what it can do.
Each time you add the server the app registers again and asks again; earlier connections stay listed until you revoke them. Connecting an app signs it in to your account and we email you each time, so if you don't recognise one, revoke it in Settings → Account → Connected apps: it is signed out of Prompt Dock's server at once.
- If the browser shows "can't be reached" right after you approve, your agent stopped waiting: run the login command again and approve once more.
- A sign-in error that appears before Prompt Dock's page loads comes from Supabase's authorization page, which runs our sign-in. It carries no Prompt Dock reference; run the login command again to retry.
- If the approval page says the connection request expired (it happens when you signed up mid-way and confirmed your email first), go back to your agent and run the login step again.
- If you add an authenticator to your account after connecting an app, its calls are refused with mfa_required: revoke the app and connect again, and you'll be asked for your code.
- When a tool says you are signed out, sign in again: in Claude Code run
/mcpand choose Re-authenticate; in Codex runcodex mcp login promptdock.
What the tools do
| Tool | What it does |
|---|---|
| whoami | The member this app acts as: user_id, handle, display_name, email, role, plan_label, the OAuth client_id and the consent level (edit or submit). |
| get_account | whoami plus Playground tokens left (today and this period), earned badges, prompt/skill/blog counts by status, the public profile URL and the account state (active or closing). |
| get_publishing_rules | The live limits, enums and the review sentence: per-entity axes (prompts and skills: status + visibility; blogs: status only), field caps, the live skill package limits, the folder depth for staged and inline packages, image caps, the publish budget. |
| list_categories | The prompt categories a create may name: slug (the category value), name and the count of published public prompts. |
| list_models | The model catalogue a prompt may recommend: slug, label (the recommended_model value), provider, kind, premium (Master-only in the Playground), legacy and outputs. |
| search_prompts | Find public prompts by relevance: ids, titles, URLs and access class only, never a body (reveal_prompt reads one). |
| reveal_prompt | Read a published, public prompt's body under the member's plan: free prompts for everyone, premium ones on Explorer or above within the daily premium limit. |
| list_my_prompts | The member's own prompts in any status, newest first, one page at a time: titles, status, visibility, access, URLs and images, never a body (get_my_prompt reads one). |
| get_my_prompt | One of the member's OWN prompts, whole, in any status: body, variables, images with images_token, tags, a staged update waiting for review, and the reviewer's reason or note. |
| create_prompt | Create one of the member's prompts, a private draft by default; publish: true also submits it for human review. |
| update_prompt | Change one of the member's own prompts: send only the fields to change (null clears description or model). |
| publish_prompt | Submit one of the member's own prompts for human review: a person checks it before it goes live. |
| begin_upload | Stage files from disk: images (and, on release 2, skill files). |
| list_my_skills | Your own skills in any status, newest first: status, visibility, access, file counts, images with their images_token, links. |
| get_my_skill | One of YOUR skills in any status: metadata, the live package's file list (path, size, type, sha256; never the contents), a staged update waiting for review, the reviewer's words, and images with their images_token. |
| create_skill | Create a skill with its package from inline files, a begin_upload session (staged) or a public GitHub repo; a draft unless publish:true also submits it for review (Create, edit and submit level; 5/h, 20/day budget). |
| update_skill | Update YOUR skill: metadata (merge-patch), a new package from any source, and images with images_token. |
| publish_skill | Submit YOUR skill for human review (a non-admin publish becomes in_review; a person checks it before it goes live). |
| install_skill | Get a published skill's files to install: every file's path, size, sha256 and a 5-minute download URL, plus the npx install line. |
| confirm_skill_install | Confirm an install_skill install after every file's sha256 checked out and the files were written, so the install counts for the skill's creator. |
| list_my_blog_posts | Blogs have one axis, status: draft, unlisted or published. |
| get_my_blog_post | Blogs have one axis, status: draft, unlisted or published. |
| create_blog_post | Blogs have one axis, status: draft (default) or unlisted (readable by link) from here; published is a dashboard click. |
| update_blog_post | Blogs have one axis, status: draft or unlisted from here; published is a dashboard click, and a published post changes only there. |
Every argument, result field and an example call per tool are in the tool reference.
Limits
| Limit | Now |
|---|---|
| Calls per member | 240 a minute |
| Submissions for review | 5 in any hour, 20 in any 24 hours |
| New prompts, drafts included | 5 in any hour |
| Prompt reveals (reveal_prompt) | 20 in any hour |
| Items per list page | 20 by default, at most 50 |
| Images on a prompt | 8 |
| Images on a skill | 5 |
| Images on a blog post | 5 |
| One inline image | 256 KB decoded |
| Inline bytes in one call | 3 MB decoded, images and files together |
| Staged uploads (begin_upload) | 20 an hour, 5 open at once, 50 MB reserved |
| Files in a skill package | 100 |
| Largest skill file | 3 MB |
| Whole skill package | 25 MB |
Submissions are limited to 5 an hour and 20 in any 24 hours because a person reviews each one. Submit again after the wait, or from the dashboard. Both windows roll: each submission counts for an hour and for 24 hours from the moment it was made. Past the budget, open the draft in your dashboard and submit it there; a submission refused for the budget changes nothing, and the drafts you already made are saved.
New prompts and prompt reveals are counted per member over a rolling hour. A call refused before it does anything takes nothing: a create with a bad field, or a reveal of a prompt that isn't there or is above your plan. A create with publish: true counts as a new prompt and as a submission. When a limit is reached, the error says how many seconds until the next call goes through (retry_after_secs); the dashboard is never limited by your apps.
Every other tool has its own budget, kept apart from your dashboard's, so an agent that loops can spend only its own.
Large uploads
A call can carry 3 MB of decoded inline bytes, and the hosting platform refuses a request body past about 4.5 MB before it reaches us (the client sees a bare HTTP 413). Anything from disk goes through begin_upload instead: it returns an upload link and a ready-to-run curl line per file, then the create names the uploaded file. An image is public by URL as soon as a create or update saves it to the item, before any review. Removing it stops the item showing it, but its URL can keep loading afterwards, so never put anything private in an image.
You need a longer client timeout only when a call carries a skill package or a set of images large enough to keep the server working past 60 seconds; every other tool answers well inside the default.
Codex: under the server's table in ~/.codex/config.toml
[mcp_servers.promptdock]
tool_timeout_sec = 180Claude Code: start it with a longer MCP tool timeout (in milliseconds).
MCP_TOOL_TIMEOUT=180000 claudeTell your agent
Paste these five lines into your project's CLAUDE.md or AGENTS.md:
Save what you create on Prompt Dock as a draft; submit it for review only when I ask.
Call get_publishing_rules before you upload files or images.
Submitting a prompt or skill sends it to human review; it isn't live until a person approves it.
When a blog post links a prompt, link one of my own prompts (list_my_prompts finds them).
Pass a fresh uuid as idempotency_key on every create, and reuse it only to retry that same create.If something goes wrong
Sign-in fails with a registration error
The sign-in client may not be registered for this environment. Check the server URL, use the pre-registered command for your client, then run the login step again.
The browser says it can't be reached
Right after you approve, the browser hands the sign-in back to your agent. If the agent stopped waiting, the page can't be reached: run the login command again (in Claude Code /mcp → Authenticate; in Codex codex mcp login promptdock) and approve once more.
Port 8765 or 8766 is in use
The pre-registered commands sign in on a fixed port: 8765 for Claude Code and 8766 for Codex. If another program holds it, the sign-in can't finish. Close that program and run the login step again, or use the command under "If you prefer the client to register itself", which picks a free port; the approval page then labels the app Unverified app.
It says I'm signed out
The token expired, or the app was revoked. A revoke from Settings → Account → Connected apps takes effect at once; one made somewhere else ends within the hour. Sign in again: in Claude Code run /mcp and choose Re-authenticate; in Codex run codex mcp login promptdock.
It added the server in one folder only
Claude Code adds a server to the current folder unless the command says otherwise. Every add command on this page carries -s user, which adds it for every folder. If Claude Code says promptdock already exists, remove the copy in that folder with Claude Code's remove command (the name is promptdock), then run the add command from step 1 again.
My submit was refused
Two things refuse a submit, and the refusal names which.
- The level. This app's connection can create and edit but not submit for review. In Settings → Account → Connected apps, choose "Change what it can do" for this app and pick Create, edit and submit. No reconnect needed.
- The budget. Submissions are limited to 5 an hour and 20 in any 24 hours because a person reviews each one. Submit again after the wait, or from the dashboard.
The two error shapes
A tool that can't do what was asked returns a result marked isError: first a sentence with what went wrong and what to do, then a JSON object with code, message, fix and doc_url. Before any tool runs, the server can also answer over HTTP: a 401 makes the client ask you to sign in again, and a 403, 429 or 503 carries the same JSON object. Every code is explained in MCP errors.
A fault on our side carries a reference that starts with mcp_. Send it to support with roughly when it happened; it finds the server log line with the cause. To disconnect an app, revoke it in Settings → Account → Connected apps.