FastMCP server for posting formatted content to X (Twitter) β Tollbooth-monetized, DPYC-native
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Sword-swift posting of pretty tweets to X (Twitter) via AI agents, monetized with Bitcoin Lightning micropayments through the DPYC(TM) Tollbooth protocol.
eXcalibur is a FastMCP server that lets AI agents post to X (Twitter) with rich Unicode formatting and optional images. Patron authentication for X uses OAuth2 Authorization Code + PKCE -- no credentials appear in chat. Operator credentials (X app keys, BTCPay) arrive via human-in-the-loop Secure Courier and are stored in the operator's per-operator Neon vault schema. Tool calls are metered with Tollbooth DPYC(TM) pre-funded Lightning balances -- Don't Pester Your Customer.
Part of the DPYC(TM) Social Contract.
Connect via Horizon -- no local install needed:
Call excalibur_session_status to see your current session state. If you have
an active session with funded credits, you are ready to post.
how_to_join() tool, or any
Nostr client.excalibur_begin_oauth(npub=<npub>) -- returns an authorize_url.
Open the primary authorize_url (not a shortlink) in your browser and
authorize the app on X.excalibur_check_oauth_status(npub=<npub>) -- completes the code
exchange, vaults the tokens, and activates your session.Sessions are keyed by npub. Tokens are stored in the Neon vault and auto-refresh on expiry.
Operator credentials (X OAuth2 app keys, BTCPay connection) are delivered via
Secure Courier (service="excalibur-operator"). This is a human-in-the-loop
flow: the operator consciously approves each credential delivery via their
Nostr client. On receive_credentials, the relay DM is destructively drained
-- credentials exist only in the Neon vault after receipt.
Tool calls cost api_sats per call. Credits have a tranche_lifetime --
each purchase creates a tranche that expires after the configured lifetime.
Auth and balance tools are always free. Use excalibur_check_balance to see
your balance and tranche expiry. Top up via excalibur_purchase_credits.
Standard DPYC(TM) tools are registered by register_standard_tools() from
tollbooth-dpyc. These include
session management, credit operations, Secure Courier, pricing, notarization,
and Oracle delegation. Each tool is identified by a deterministic UUID v5.
| Category | Tools |
|---|---|
| Session & Billing | session_status, check_balance, account_statement, account_statement_infographic, restore_credits, service_status, check_price, check_authority_balance |
| Secure Courier | request_credential_channel, receive_credentials, forget_credentials |
| Npub Proof | request_npub_proof, receive_npub_proof |
| Purchase | purchase_credits, check_payment |
| Pricing & Constraints | get_pricing_model, set_pricing_model, reset_pricing_model, list_constraint_types |
| Notarization | notarize_ledger, list_notarizations, get_notarization_proof |
| Onboarding | get_operator_onboarding_status, get_patron_onboarding_status |
| OAuth (X) | begin_oauth, check_oauth_status |
| Oracle (delegated) | oracle_about, oracle_how_to_join, oracle_lookup_member, oracle_get_tax_rate, oracle_network_advisory |
Domain tools are defined in server.py (with storage handlers under
tools/). Prices are set by the operator's pricing model -- preview any
call with check_price. Read and auth tools are free.
Posting to X
| Tool | Description |
|---|---|
post_tweet | Post a text tweet with markdown-to-Unicode rich text formatting |
post_tweet_image | Post a tweet with a hero banner image (image URL or SVG rendered to PNG) |
get_x_profile | Fetch the connected X account's handle and name for this patron (free) |
Stored posts (drafts & scheduling)
| Tool | Description |
|---|---|
create_post | Store a new post (draft or scheduled); returns its post_id |
get_post | Read one stored post by id (owner-scoped) |
list_posts | List your stored posts, server-side sorted, filtered, and paginated |
update_post | Patch a stored post (doc, publish_at, recurrence, status) |
delete_post | Delete a stored post (soft delete by default) |
Snippets & Voice
| Tool | Description |
|---|---|
list_snippets | List your saved post snippets (server-side sorted/filtered/paginated) |
get_snippet | Read one saved snippet by id |
save_snippet | Save a reusable snippet (opening/footer/CTA) |
delete_snippet | Delete a saved snippet (free, owner-scoped) |
get_voice | Read your saved writing Voice (profile blurb + banned words) |
save_voice | Save your per-npub writing Voice |
AI editorial & dynamic blocks
| Tool | Description |
|---|---|
refine_post_region | Refine a flagged region of a post with an LLM, server-side |
resolve_dynamic_block | Start resolving a dynamic (prompt-backed) post block; returns a claim check |
fetch_dynamic_block | Redeem a resolve_dynamic_block claim check (free, proof-gated) |
Scheduler
| Tool | Description |
|---|---|
process_scheduled_posts | Publish every due scheduled post (operator-only) |
get_scheduler_log | Read recent scheduler-tick outcomes |
scheduler_status | The scheduler's configuration and current status (free; any proven patron) |
scheduler_pending | What the scheduled-post cron Worker is waiting on (operator-only) |
scheduler_check_now | Run one scheduler tick now (operator-only) |
OAuth flow tools (begin_oauth, check_oauth_status) are now standard tools
provided by the wheel (see the Standard Tools table above).
All tools that take an npub also accept a proof: str parameter for
kind-27235 Schnorr proof attestation.
npub),
not an email or password. One keypair per role, managed by the user.request_npub_proof / receive_npub_proof.Key design choices:
begin_oauth returns the primary authorize_url (not a shortlink);
check_oauth_status completes the exchange. Tokens stored in Neon vault,
auto-refreshed on expiry. No OAuth 1.0a.register_standard_tools() provides
all DPYC(TM) infrastructure tools. Only domain-specific X/Twitter tools are
defined in server.py.**bold**, *italic*, and # headers
to Unicode characters that render in tweets without markup syntax.| Variable | Required | Description |
|---|---|---|
TOLLBOOTH_NOSTR_OPERATOR_NSEC | Yes | Operator's Nostr secret key for identity bootstrap and DM encryption |
This is the only env var required to start. All other secrets (X app keys, BTCPay credentials) arrive via Secure Courier credential templates and are stored in the per-operator Neon vault schema.
These are delivered via Secure Courier (service="excalibur-operator"), not
set as environment variables:
| Credential | Description |
|---|---|
client_id | X OAuth2 Client ID (from X Developer Portal) |
client_secret | X OAuth2 Client Secret (from X Developer Portal) |
btcpay_host | BTCPay Server URL |
btcpay_store_id | Store ID for invoices |
btcpay_api_key | API key with invoice permissions |
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/excalibur-mcp)<a href="https://allmcps.com/mcp/excalibur-mcp"><img src="https://allmcps.com/api/badge/excalibur-mcp?style=directory" alt="Excalibur MCP on AllMCPs" /></a>