AskElephant MCP
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AskElephant MCPsearch transcripts for Acme Corp calls from last month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AskElephant MCP
A Cloudflare Worker that lets Meticulosity staff dig into AskElephant call transcripts from claude.ai, on the web and on mobile.
Live: https://askelephant-mcp.<your-subdomain>.workers.dev/mcp
Deploy your own: SETUP.md
Setup for staff: docs/install-guide.md
How to ask for things: docs/usage-examples.md
Why this exists
AskElephant ships an MCP server, but it runs locally over stdio. That works for Cursor, VS Code, Windsurf and Claude Desktop, and it does nothing for claude.ai, which can only talk to a hosted endpoint. Our team works in claude.ai, so transcripts were out of reach there. This Worker is the hosted endpoint.
It is read-only. Every path to AskElephant is a GET. Nothing in this codebase can change, delete, or create anything in your AskElephant account.
Related MCP server: Remote MCP Server
The problem it actually solves
Transcripts are enormous. Measured across the real corpus:
characters | approx tokens | |
average call | 41,518 | 10,400 |
largest measured | 129,088 | 32,300 |
Handing whole transcripts to a model costs about 415,000 tokens for a forty-call search, which does not fit in a 200,000-token context window. So the design principle is:
The Worker does the reading. Claude does the thinking.
Transcript text never reaches the model unless someone explicitly asks for it. A forty-call search costs roughly 12,400 tokens instead of 415,000, because the Worker fetches the transcripts, scans them itself, and returns only the matching passages.
The five tools, cheapest first
Tool | What it does | Cost |
| Compact rows: id, title, date, duration, companies | ~30 tokens per row |
| Name to id lookup for the filters | negligible |
| Searches inside transcripts, returns short excerpts with speaker and timestamp | ~12,400 tokens for 40 calls |
| Full raw text, in chunks | up to ~32,000 tokens for one call |
The tool descriptions themselves steer Claude toward the cheap ones. That is
deliberate: get_transcript describes itself as expensive and points at
search_transcripts first.
search_transcripts requires a narrowing filter (a date range, a company, a
contact, or title terms). Without one it would scan the entire corpus of 3,705
engagements, so it refuses instead.
Architecture
claude.ai --MCP over Streamable HTTP--> Worker --REST--> app.askelephant.ai/api/v2
|
+-- KV cache (transcripts, 90 day TTL)Stateless apart from the cache. No database, no ingestion pipeline, no sync job. The Worker is fully correct with the cache empty; the cache only saves refetching.
Login is Cloudflare Access over OIDC with PKCE.
@cloudflare/workers-oauth-provider makes the Worker its own OAuth server so
claude.ai can register itself, and delegates the actual login upstream to
Cloudflare Access. Access is restricted to the named individuals in CONFIG.allowedEmails.
Repo layout
Path | What |
| Every deployment-specific value. The seam a fork changes. |
| The only code that talks HTTP to AskElephant |
| Listing and the compact projection |
| Read-through KV transcript cache |
| Pure excerpt scanner, no IO |
| Search orchestration, caps and guards |
| The five tools |
| Cloudflare Access OIDC login |
| Verified AskElephant API reference. See below. |
docs/api-notes.md is the valuable part
AskElephant's v2 API is not publicly documented. docs/api-notes.md records what
we established by probing it, with the raw commands and raw output, including
where an earlier conclusion was wrong and how it was corrected. Some of it is
genuinely surprising:
The auth header takes the raw key with no
Bearerprefixprocessing_statusreportsPENDINGfor every engagement ever, including calls from 2023, so it is useless as a filtersearchmatches titles only, never transcript bodies, which is the entire reason the excerpt scanner existsDate filters reject a plain
2026-01-01and require a full UTC datetimefilter[company_ids]returns a 400 without an operator; it needsfilter[company_ids][in]There is no summary and no action-items content: the transcript is all you get
Every one of those cost us a bug or a wrong assumption first. Read that file before changing anything that talks to the vendor.
Development
npm install # requires the committed .npmrc, see below
npm test # 143 tests, no network access
npm run typecheckWhy .npmrc exists. Plain npm install fails with ERESOLVE because
wrangler, agents and @cloudflare/workers-types declare peer ranges that
npm's strict resolver will not reconcile, even though every individual range is
satisfiable. .npmrc sets legacy-peer-deps=true, which restores npm's
pre-v7 behaviour and changes which versions actually install not at all. Without
that file the build is not reproducible on a clean checkout.
Tests never touch the network. Every AskElephant response in the suite comes from a recorded fixture built from real probe output.
Deploying
The Worker lives on the Meticulosity Cloudflare account. Note that a global
CLOUDFLARE_API_TOKEN in a shell profile may point somewhere else entirely, so
pass the token explicitly:
export CLOUDFLARE_API_TOKEN=$(security find-generic-password -s cloudflare_api_token -w)
export CLOUDFLARE_ACCOUNT_ID=<YOUR_CLOUDFLARE_ACCOUNT_ID>
npx wrangler deploySecrets are set with wrangler secret put and never live in this repo:
ASKELEPHANT_API_KEY, ACCESS_CLIENT_ID, ACCESS_CLIENT_SECRET,
ACCESS_ISSUER, COOKIE_ENCRYPTION_KEY.
Data retention
Transcripts the Worker reads are cached in Cloudflare KV with a 90 day
expiry (CONFIG.cacheTtlDays). That is a retention decision, not a performance
knob: without it the Worker would keep a permanent second copy of every
transcript it ever read, outside AskElephant's own retention controls. Lower it
if your client agreements require it.
Access and offboarding
Access is an explicit list of named people in CONFIG.allowedEmails, enforced
twice: the Cloudflare Access policy names the same individuals, and the Worker
re-checks the identity before registering any tools.
It is not domain-wide, and that is a correction rather than a preference. We
first granted the whole @example.com domain, reasoning that revocation
could be delegated upstream because everyone uses a company-controlled Claude
account, so deprovisioning that account would take the connector with it. That
reasoning is wrong. The connector can be added from any Claude account,
including a personal one, because the only identity the Worker ever sees is the
Cloudflare Access identity. This was demonstrated during setup, when two
separate Claude clients registered against the same address.
Revoking someone
Removing a person from CONFIG.allowedEmails and from the Access policy stops
them getting a new grant. It does not touch a grant they already hold, which
lives in OAUTH_KV and keeps working until it expires.
To cut someone off immediately:
scripts/revoke.sh someone@example.com # deletes their grants and tokens
scripts/revoke.sh --list # show every live grantDo all three: revoke the grant, remove them from CONFIG.allowedEmails and
redeploy, and remove them from the Cloudflare Access policy. The first cuts off
the session they have; the other two stop them logging back in.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityDmaintenanceA demonstration project that uses Cloudflare Workers MCP to create custom AI tools that can be integrated with Claude, Cursor, and other AI assistants supporting the Model Context Protocol.Last updated21030MIT
- Flicense-qualityCmaintenanceA Cloudflare Workers-based implementation of the Model Context Protocol (MCP) server that enables tool usage in Claude through OAuth authentication.Last updated
- Flicense-qualityCmaintenanceA Cloudflare Workers-based MCP server template for building remote MCP servers without authentication. Provides a starting point for deploying custom tools accessible from Claude Desktop or other MCP clients.Last updated
- Flicense-qualityBmaintenanceEnables AI agents to read, write, and search security findings, engagement memory, and semantic triage via MCP tools on Cloudflare Workers.Last updated
Related MCP Connectors
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/meticulosity/askelephant-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server