Connect your agent
One URL for Claude, ChatGPT, Grok, Hermes, Cursor and every MCP client, with the exact line for each.
MCP server
Streamable HTTPhttps://pnl.meme/v1/mcp
- one JSON-RPC message per POST
- JSON answers
- no session to keep
Pick your client
18 clientsYour terminal. One command; the server is there in the next session.
claude mcp add --transport http pnl https://pnl.meme/v1/mcp
claude mcp add --transport http pnl https://pnl.meme/v1/mcp \
--header "Authorization: Bearer pnl_..."
Add --scope user to reach it from every project. Run /mcp inside a session to see it connected.
claude.ai and Claude Desktop share one list of connectors.
- Open Customize › Connectors, press + Add, then Add custom connector.
- Name it PNL, paste
https://pnl.meme/v1/mcpas the server URL, press Continue. - Under Authentication choose No sign in, then press Add.
https://pnl.meme/v1/mcp
- Under Request headers add authorization with the value
Bearer pnl_..., then press Add.
Request headers are a beta some organizations see; without them the connector reads on the public tier. On Team and Enterprise an Owner adds it under Organization settings › Connectors. A Free plan holds one custom connector.
chatgpt.com, on the web.
- Open chatgpt.com/plugins, press +, then Add custom MCP server.
- Name it PNL and paste
https://pnl.meme/v1/mcpas the Server URL. - Choose No authentication, confirm the warning, then press Create as a plugin.
- In a chat, type @ and pick PNL.
https://pnl.meme/v1/mcp
ChatGPT offers OAuth or no authentication, never a header of your own, so it reads on the public tier.
Custom MCP servers are on Business and Enterprise/Edu; Pro connects servers that only read, which is every tool the public tier lists.
Your terminal. The server lands in ~/.codex/config.toml, shared with the Codex app and IDE extension.
codex mcp add pnl --url https://pnl.meme/v1/mcp
export PNL_API_KEY="pnl_..."
codex mcp add pnl --url https://pnl.meme/v1/mcp --bearer-token-env-var PNL_API_KEY
Codex reads PNL_API_KEY each time it connects: keep the export in your shell profile. In config.toml the same line is bearer_token_env_var = "PNL_API_KEY".
Your own code: the Responses API calls the server for you, from OpenAI's side.
curl https://api.openai.com/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-6-astra",
"tools": [{
"type": "mcp",
"server_label": "pnl",
"server_url": "https://pnl.meme/v1/mcp",
"require_approval": "never"
}],
"input": "What is trending on PNL right now?"
}'
curl https://api.openai.com/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-6-astra",
"tools": [{
"type": "mcp",
"server_label": "pnl",
"server_url": "https://pnl.meme/v1/mcp",
"headers": { "Authorization": "Bearer pnl_..." },
"require_approval": "never"
}],
"input": "What is trending on PNL right now?"
}'
require_approval defaults to always. allowed_tools narrows the list to the tools you name.
grok.com, for every Grok user.
- Open grok.com/connectors, press New Connector, then Custom.
- Paste
https://pnl.meme/v1/mcp. It asks for no sign-in.
https://pnl.meme/v1/mcp
xAI documents no header field for a custom connector, so Grok reads on the public tier.
On Grok Business and Enterprise an admin adds the server first, at console.x.ai › Grok Business › Connectors.
Your terminal.
grok mcp add --transport http pnl https://pnl.meme/v1/mcp
grok mcp add --transport http pnl https://pnl.meme/v1/mcp \
--header "Authorization: Bearer pnl_..."
Your own code: Grok calls the server for you, from xAI's side.
curl https://api.x.ai/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $XAI_API_KEY" \
-d '{
"model": "grok-4.7",
"input": [{ "role": "user", "content": "What is trending on PNL right now?" }],
"tools": [{
"type": "mcp",
"server_url": "https://pnl.meme/v1/mcp",
"server_label": "pnl"
}]
}'
curl https://api.x.ai/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $XAI_API_KEY" \
-d '{
"model": "grok-4.7",
"input": [{ "role": "user", "content": "What is trending on PNL right now?" }],
"tools": [{
"type": "mcp",
"server_url": "https://pnl.meme/v1/mcp",
"authorization": "pnl_...",
"server_label": "pnl"
}]
}'
authorization takes the bare key; xAI sends it as Authorization: Bearer. The xai-sdk equivalent is mcp(server_url=…, server_label="pnl", authorization=…).
A chat with your Bot. It adds servers itself, by URL.
- Tell your Bot: Add this MCP server:
https://pnl.meme/v1/mcp
https://pnl.meme/v1/mcp
xAI documents no header for a Bot's server, so it reads on the public tier.
On Enterprise, a team policy on MCP servers decides whether a Bot may add one.
Your terminal, or ~/.hermes/config.yaml.
hermes mcp add pnl --url https://pnl.meme/v1/mcp
mcp_servers:
pnl:
url: "https://pnl.meme/v1/mcp"
headers:
Authorization: "Bearer pnl_..."
Run /reload-mcp in a session that is already open.
~/.config/muse/settings.json.
{
"schema_version": 1,
"mcp_servers": {
"pnl": {
"transport": "streamable_http",
"url": "https://pnl.meme/v1/mcp"
}
}
}
{
"schema_version": 1,
"mcp_servers": {
"pnl": {
"transport": "streamable_http",
"url": "https://pnl.meme/v1/mcp",
"headers": {
"Authorization": "Bearer pnl_..."
}
}
}
}
Keep one block: a file holding both mcp_servers and mcpServers turns MCP off for the session.
~/.cursor/mcp.json for every project, or .cursor/mcp.json for one.
{
"mcpServers": {
"pnl": {
"url": "https://pnl.meme/v1/mcp"
}
}
}
{
"mcpServers": {
"pnl": {
"url": "https://pnl.meme/v1/mcp",
"headers": {
"Authorization": "Bearer pnl_..."
}
}
}
}
Restart Cursor after saving the file.
.mcp.json at the workspace root, or ~/.copilot/mcp-config.json for every workspace.
{
"mcpServers": {
"pnl": {
"type": "http",
"url": "https://pnl.meme/v1/mcp",
"tools": [
"*"
]
}
}
}
{
"mcpServers": {
"pnl": {
"type": "http",
"url": "https://pnl.meme/v1/mcp",
"headers": {
"Authorization": "Bearer pnl_..."
},
"tools": [
"*"
]
}
}
}
Copilot agent sessions read this file directly. Keep a key out of a workspace you commit.
Your terminal. -s user writes ~/.gemini/settings.json.
gemini mcp add -s user --transport http pnl https://pnl.meme/v1/mcp
gemini mcp add -s user --transport http \
--header "Authorization: Bearer pnl_..." \
pnl https://pnl.meme/v1/mcp
Writing settings.json by hand, the field is httpUrl: url means the older SSE transport, which this server does not speak.
settings.json, under context_servers.
{
"context_servers": {
"pnl": {
"url": "https://pnl.meme/v1/mcp"
}
}
}
{
"context_servers": {
"pnl": {
"url": "https://pnl.meme/v1/mcp",
"headers": {
"Authorization": "Bearer pnl_..."
}
}
}
}
Your terminal, or the extension's Remote Servers tab.
cline mcp add pnl https://pnl.meme/v1/mcp --transport http --yes
cline mcp add pnl https://pnl.meme/v1/mcp --transport http \
--header "Authorization: Bearer pnl_..." --yes
Writing cline_mcp_settings.json by hand, set "type": "streamableHttp": without it Cline uses SSE.
~/.config/devin/mcp_config.json, read by the Devin Local agent.
{
"mcpServers": {
"pnl": {
"url": "https://pnl.meme/v1/mcp",
"transport": "http"
}
}
}
{
"mcpServers": {
"pnl": {
"url": "https://pnl.meme/v1/mcp",
"transport": "http",
"headers": {
"Authorization": "Bearer pnl_..."
}
}
}
}
Windsurf became Devin Desktop; its Cascade agent no longer starts conversations, so the server goes in the Devin agent's file.
Anything that speaks the Streamable HTTP transport: a URL, and a header if you hold a key.
{
"mcpServers": {
"pnl": {
"url": "https://pnl.meme/v1/mcp"
}
}
}
{
"mcpServers": {
"pnl": {
"url": "https://pnl.meme/v1/mcp",
"headers": {
"Authorization": "Bearer pnl_..."
}
}
}
}
Protocol revisions 2026-07-28 (no initialize; server/discover lists the revisions), 2025-06-18 and 2025-03-26. One message per POST, no batching, no session id. GET is 405: the server opens no stream of its own.
One question, end to end
Your agent turns the question into one tool call. PNL answers it from its own records, and every figure comes back with the clock it was read at.
- YOU“should I touch this token?”
- YOUR AGENTcalls get_token
- PNLanswers from its own records
- THE ANSWERevery figure with its clock
{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "get_token",
"arguments": {
"token": "<mint>",
"callers": true
}
}
}
{
"read_at": "<ISO time>",
"token": { "ticker": "<ticker>" },
"market": {
"market_cap_usd": <number>,
"liquidity_usd": <number>,
"holders": <number>,
"market_cap_at": "<ISO time>"
},
"call": {
"entry_cap_usd": <number>,
"peak_cap_usd": <number>,
"below_entry": <boolean>
},
"callers": { "count_24h": <number> },
"risks": [ … ],
"flags": { "dead_under_7k": <boolean> }
}
GET https://pnl.meme/v1/tools/get_token?token=<mint>&callers=true, answered as { "skill": "token.verdict", "cost_usd": 0, "result": { … } }.Talk to it by hand
The server is plain JSON-RPC over HTTPS, so curl is a client too. Useful when a client says it cannot connect.
curl https://pnl.meme/v1/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18"}}'
Prompts
Three prompts ship with the server. A client that shows prompts (Claude, VS Code and others) lists them under the server's name.
No key, a free key, a plan
- No key20 rows a call · 30 a minuteThe free reads, on a shared daily allowance. Nothing to sign up for.
- A free key500 calls a day · 30 a minuteYour own allowance, the full rows, a watchlist and a changes cursor.MINT A FREE KEY
- A planNOWfrom 49 USDC · 30 daysMore calls, open streams and the live reads.Every plan
The server lists each caller what it may call: a tool your key cannot run is not on its list, and get_started says who you are to it.