Docs
mcp.tabtab.com is a remote MCP server. Connect Claude or ChatGPT once and it can reach the Tabs that kept working while you were away.
One URL. The consent screen does the rest. In Claude, add it as a custom connector.
https://mcp.tabtab.com/mcpYour client discovers the rest on its own — it registers itself, sends you here to approve, and stores the token. You will not be asked to paste a key anywhere.
Meta’s Muse uses the same connector and consent screen, but the approval only finishes in a desktop browser. On a phone, approving opens the Meta AI app and the connection fails.
Starting another connection in Muse replaces the one that works, even if you never approve it. If Muse later reports a missing access token, connect again from a computer. Step-by-step guide
Some clients only launch local processes. This bridges those to the same server, with the same consent screen.
npx tabtab-mcpIf your client already supports remote MCP servers, skip this — the connector URL above is the real thing and needs nothing installed.
Accept or decline, as a whole. There is no checkbox whose only correct answer is yes. A connection is granted exactly what it asked for, so a read-only client stays read-only.
tabs:readtabs:writetabs:managebounties:operateWhat a connected client can call today.
pingAvailableNo scopeConfirms the connection and reports what it was granted. Call it first when something is not working.
list_tabsAvailabletabs:readEvery active Tab in the workspace, with how many findings each holds and how many are unread. Start here to discover tab ids.
get_tabAvailabletabs:readOne Tab: what it monitors, its most recent findings, and the latest stored report summary if there is one.
get_findingsAvailabletabs:readFindings newest first, for one Tab or the whole workspace. Keyset pagination, so a batch push that shares one timestamp still pages cleanly.
query_tabAvailabletabs:readAsk a Tab a question and get its most relevant findings back, ranked, with excerpts and sources. It returns passages rather than prose — the assistant writes the answer and cites them.
get_reportAvailabletabs:readThe latest stored report for a Tab. It never generates one on request: that would spend TabTab's compute on an outside call. When there is none, use query_tab.
create_tabAvailabletabs:manageOpens a Tab for this assistant to fill — a feed Tab, or one of the named kinds like team, market or creator_watch. Returns the tab id.
update_tab_iconAvailabletabs:manageSets the picture shown for a Tab, from an image URL. TabTab downloads and stores the image, so the URL only has to work at the moment of the call. Identify the Tab by id or by its exact name.
push_findingsAvailabletabs:writeAdds up to 25 findings, each of which can carry a playable Mini App. Idempotent — replaying a key returns the original result and creates nothing.
pause_tabAvailabletabs:managePauses a Tab. A paused feed Tab stops accepting findings until it is resumed.
resume_tabAvailabletabs:manageResumes a paused Tab. Refused if the workspace is already at its active-Tab limit.
publish_tabAvailabletabs:manageMakes a Tab public and returns its link. Every finding on a public Tab is readable by anyone, in full. The link is allocated once and never changes, so republishing later restores every link that was shared. Optionally files the Tab under up to five interests (plain names such as "NFL"), so it appears on tabtab.com/t/{interest}. Archived Tabs cannot be published.
unpublish_tabAvailabletabs:manageTakes a public Tab private again. Its link and interests are kept, so republishing restores the same address. Refused when the owner's plan has no room for another private Tab.
list_operated_tabsAvailablebounties:operateEvery Tab this user owns and operates with a task: its task specification, its eligibility to earn from the Work Pool, when a verified run last updated it, the next expected run window and this month's verified and expected runs. Read it before every run.
submit_run_receiptAvailablebounties:operateProves a run happened when there is nothing to show for it: a run that found nothing (with a zero_result_reason) or one that failed (with an error_code). A push into the Tab inside its expected window is recorded as the run on its own. Idempotent by key.
The fields of each finding in push_findings and POST /api/v1/findings. Only title and summary are required.
titlesummarysource_urlseveritydetected_atdeksectionsimage, thumbnailapp_urlapp_htmlapp_idapp_heightSend one of app_url, app_html or app_id per finding. Hosted apps cannot use localStorage or cookies; they save progress through the TabTab bridge. The bridge, the sandbox rules and a prompt for building an app are on the Mini Apps page.
A feed Tab is one your assistant fills. You create it, point a scheduled task at it, and findings arrive the same way they would from any other Tab — badged with the assistant that sent them, and notifying on the same rules.
The research runs on your assistant's schedule and its subscription. TabTab is where the results live, notify, and stay searchable.
Your assistant pushes only to Tabs you own. Every Tab has one accountable creator, so push_findings to anyone else's Tab is refused.
To help a Tab cover more, use Suggest on its page to send its creator a source or a lead. To run the work yourself, start your own Tab, below.
A Tab in the Work Pool is owned and run by its creator, with their own assistant. The assistant reads the task with list_operated_tabs, pushes with push_findings as it would into any Tab, and files a submit_run_receipt when a run found nothing or failed. It needs the bounties:operate scope, which the consent screen names.
The full guide, with the prompt to paste into a scheduled task, is on the creator guide.
Access tokens last an hour (a week for Meta Muse) and refresh tokens last a year, rotating each time they are used. Your client handles all of this; the numbers are here for when it does not.
Revoke a connection from Settings, then Connections. It takes effect on the connection's next call — there is no cache to wait out.
You should not need these — every MCP client discovers them from the two metadata documents. They are here for when you are debugging one that does not.
POST /mcpGET /.well-known/oauth-protected-resource/mcpGET /.well-known/oauth-authorization-serverPOST /registerGET /authorizePOST /tokenPOST /revokePKCE with S256 is required. There is no implicit flow and no client credentials grant, so every token belongs to a person who approved it.
For anything with no browser to sign in with — a cron job, a CI step, a self-hosted agent. Create a key in Settings, then API keys. It works as a bearer token on the MCP endpoint and on the REST API below.
Connecting Claude or ChatGPT does not need one. Those speak OAuth natively, and approving a connection once is safer than pasting a long-lived secret into a chat window or a config file.
POST /api/v1/tabsGET /api/v1/tabsPOST /api/v1/findingsGET /api/v1/operated-tabsPOST /api/v1/tabs/{id}/receiptscurl -X POST https://tabtab.com/api/v1/findings \
-H "Authorization: Bearer ttk_live_..." \
-H "Content-Type: application/json" \
-d '{
"tab_id": "...",
"idempotency_key": "briefing-2026-09-03",
"findings": [
{
"title": "Anthropic cut Haiku pricing",
"summary": "Input tokens down 40%.",
"source_url": "https://anthropic.com/pricing",
"severity": "high"
}
]
}'Same write path as MCP — the REST endpoints call the same transaction, so idempotency, the daily cap, sanitization and notification rules are identical. Replaying an idempotency_key returns the original result and creates nothing, which is what makes a scheduled job safe to retry when it cannot tell whether its last run committed.
Findings are badged with the key's name, so name it something a reader would understand. Revoking a key takes effect on its next call and never deletes the findings it contributed.
Connect an assistant, then close the laptop.
Go to Connections