X Marketplace Seller MCP
Click on "Deploy 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., "@X Marketplace Seller MCPList my PS5 for ₦450k, floor ₦380k, pickup at Lekki mall"
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.
X Marketplace Seller MCP
Live MCP URL (Streamable HTTP): https://x-marketplace-seller-mcp.vercel.app/mcp
Health check: https://x-marketplace-seller-mcp.vercel.app/health
A selling assistant for X (Twitter). It covers:
Drafting listing posts (text, pricing, photos list).
Drafting buyer replies, with scam-pattern detection.
A negotiation engine that stays within your private floor and ceiling.
Pickup and delivery arrangement drafts.
A deal ledger.
Human approval by design. Every reply, post, DM and deal acceptance is returned as a draft. A deal only becomes "agreed" through
approve_dealwithconfirm: true. Posting and DMs are optional. They needconfirm: trueand the end user's own X OAuth 2.0 user token; without a token the tools only draft. Buyer messages are treated as untrusted data.
Tools
Tool | What it does | External effect |
| Item, condition, ask, private floor, ceiling, ≤4 photo URLs/paths, pickup/delivery, payment and rules. Drafts a post of ≤280 chars, with URLs counted as 23 | None (local ledger) |
| Manage listings. Changing price or rules re-drafts the post | None |
| Detects intent (availability, offer, condition, logistics, hold, payment), extracts the offer (e.g. "$350", "1.2k", "₦375k"), flags scams, runs the negotiation engine per buyer thread and drafts a reply | None (draft) |
| What-if test of an offer without recording anything | None |
| Pickup or delivery confirmation message with safety tips. Refuses prices below the floor | None (draft) |
| Records a deal as pending approval. Refuses prices below the floor | None |
|
| None (local) |
| Completed revenue, agreed value, pending approvals, average discount from ask | None |
| Posts the text to X via | Only with |
| Sends an approved reply via | Only with |
Negotiation rules (per listing)
Rule | Meaning |
| No negotiation |
| Default 3 |
| Price step |
| Auto-accept level. Still only produces a draft and a pending deal |
| Offers below this share of the floor (default 60%) are treated as lowballs, and the counter stays near ask |
| Whether and how long items can be held |
| Cash at pickup only |
How the engine behaves:
It concedes from ask toward the floor over the rounds, and never counters higher than its last counter.
It never goes below the floor and never reveals the floor in drafted text.
Offers above the ceiling are accepted at the ceiling.
When the rounds run out, it gives a final offer at or above the floor.
Related MCP server: X (Twitter) MCP
Example prompts
"List my PS5 Slim for ₦450k, lowest ₦380k, pickup at Lekki Phase 1 mall or Lagos Island delivery for ₦5k."
"A buyer @ada says 'would you take ₦350,000?' Draft my reply."
"Is this message a scam? 'I'm abroad, my shipping agent will collect…'"
"Ada agreed ₦385k. Record the deal, and once I approve it, draft the delivery confirmation."
"Show my deal ledger."
Run locally
npm install && npm run build
npm start # http://localhost:3000/mcp
npm run start:stdio
npm test # 11 tests; X API is mocked
npm run smoke # full selling flow over HTTP; no token, nothing postedData lives in DATA_DIR, default ~/.x-marketplace-seller-mcp/ledger.json.
Posting is optional. To enable it, set X_USER_ACCESS_TOKEN (env, or the x-x-user-access-token header in hosted mode). It must be your own OAuth 2.0 user-context token with tweet.write (and dm.write for DMs). X API usage is billed by X under your own developer account.
Deploy to Vercel
Import the repo. The
/mcpendpoint is preconfigured.The ledger is a JSON file. Vercel's
/tmpis ephemeral, so for hosted use mount durable storage viaDATA_DIR, or swapsrc/store.tsfor KV/Postgres. Ledgers are per deployment, not per user, so multi-tenant hosting needs a per-user store key.Don't set a shared X token. Users send their own as a header.
Marketplace reviewer test
npm install && npm run build && npm test: 11 pass. These include a property test that no accept or counter is ever below the floor across 6 rounds × 65 offers, plus approval gating and mocked X calls.npm run smoke: "all ok". It walks the whole flow: create a listing, run four buyer messages through negotiation, catch a scam, propose, preview, approve, draft a handoff, check the ledger, preview a post, and refuse to post without a token.
Limitations
Photos aren't uploaded to X. The tool lists them for you to attach; media upload is a future addition.
Offer extraction is pattern-based. Unusual phrasing may be missed, and the assistant should double-check.
There's no X DM inbox reading. Paste buyer messages in.
MIT License © 2026 Segun Cole
Storage and tenant isolation
Hosted: data is kept in a private Vercel Blob store (free Hobby quota) when
BLOB_READ_WRITE_TOKENis set, at<app>/<tenant>/<file>.json, with ETag-based optimistic concurrency.Tenant key: a one-way SHA-256 hash of the caller's own credential headers, or of an
x-user-keyheader if you send one (recommended if your token rotates). Secrets are never stored and tenants can't see each other's data. Callers with no credentials and nox-user-keyshare apublic-demospace, so don't put real data there.Local / self-hosted: without a Blob token it falls back to JSON files under
DATA_DIR(default~/.x-marketplace-seller-mcp/<tenant>/).
Available Tools
11 toolsapprove_dealApprove / complete / cancel a dealA
Human-approval step. action 'approve' (requires confirm:true) marks the deal agreed and reserves the listing; 'complete' marks it sold; 'cancel' cancels and re-opens the listing. Without confirm only a preview is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| dealId | Yes | ||
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the mutation/safety profile is partly covered. The description usefully adds the confirm gate and preview fallback plus side effects (reserves/re-opens the listing), but does not state whether 'complete' and 'cancel' also honor the confirm preview behavior, leaving the confirmation contract only half disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with the gating rule front-loaded and no filler; every clause adds operational meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation tool with no output schema, the description covers the destructive actions and the preview path adequately. The remaining gap is whether confirm:true is also required for 'complete' and 'cancel', which an agent would need to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains the 'action' enum values well and clarifies 'confirm' semantics, but says nothing about 'dealId' and leaves the confirm requirement ambiguous for two of the three actions, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation and enumerates the three action values with their distinct effects ('approve' reserves the listing, 'complete' marks sold, 'cancel' re-opens the listing). This lets an agent distinguish it from nearby siblings like propose_deal and negotiate_offer. It stops short of explicitly naming a sibling it replaces or excludes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear per-action context for when each mode applies and adds a meaningful precondition (approve requires confirm:true). There is no explicit 'when-not' guidance or named alternative tool, so it lands at clear-context-but-no-exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_listingCreate a listing (draft)A
Create a sale listing: item, condition, asking price, private floor (lowest you'll accept) and ceiling, photos (≤4 URLs/paths), pickup/delivery, payment methods and negotiation rules. Returns a drafted X post (≤280 chars). Stored locally; nothing is posted.
| Name | Required | Description | Default |
|---|---|---|---|
| ask | Yes | ||
| tags | No | ||
| floor | Yes | ||
| rules | No | ||
| style | No | ||
| title | Yes | ||
| photos | No | ||
| pickup | No | ||
| ceiling | No | ||
| payment | No | ||
| category | No | ||
| currency | No | ||
| delivery | No | ||
| location | No | ||
| quantity | No | ||
| condition | Yes | ||
| highlights | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), and the description adds real value on top: it discloses that the effect is local-only persistence ('Stored locally; nothing is posted') and that it returns a ≤280-char drafted X post. It does not say what happens on repeat calls (duplicate/overwrite), which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler: the field inventory comes first and the return/side-effect statement follows. Efficient and front-loaded, though the field list is a long run-on that slightly obscures the two most decision-relevant clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states the return (a drafted ≤280-char X post) and the persistence behavior, which covers the critical unknowns for a mutation tool. For an 18-param tool with nested objects and 0% schema description coverage, though, too many optional parameters are left entirely unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and does add genuine semantics — notably 'private floor (lowest you'll accept) and ceiling' and 'photos (≤4 URLs/paths)', which clarify otherwise opaque fields. But of 18 params it only touches a subset (title/item, condition, ask, floor, ceiling, photos, pickup/delivery, payment, rules), leaving quantity, currency, location, highlights, category, style, tags and rule sub-fields undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Create) + resource (sale listing) with the key content enumerated, and it implicitly separates itself from post_listing by stating 'nothing is posted' and calling the result a draft. An agent can tell this apart from post_listing/update_listing without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'Returns a drafted X post... Stored locally; nothing is posted' tells the agent this is a draft-only step, which is a useful when-not signal for publishing. However, no sibling is named (e.g. post_listing for publishing, update_listing for edits), so the routing decision is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deal_ledgerDeal ledgerBRead-only
All deals with totals: completed revenue, pending/agreed value, average discount from ask.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds that the output is aggregate totals rather than raw deal rows, which is genuine context beyond the annotations, but it says nothing about whether results are workspace-scoped, dated, or paginated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense, front-loaded sentence that lists the returned metrics with zero padding. It works as a summary, though the missing verb and the unreconciled word 'All' cost a point against the status filter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully names the aggregates returned, which is the most important thing an agent needs. However, for a single-enum-parameter tool it omits the status filter semantics entirely, leaving a real gap in how to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the sole parameter is a meaningful status enum (pending_approval, agreed, completed, cancelled, all). The description never mentions filtering by status and its phrase 'All deals' actively implies no filtering is possible, so it does not compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (deals) and enumerates the aggregates returned (completed revenue, pending/agreed value, average discount from ask), which is far more informative than a tautology. It implicitly distinguishes itself from write-oriented siblings such as propose_deal and approve_deal by being a reporting view, though it never says so explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of alternatives, and no indication of when an agent should call deal_ledger rather than list_listings or query a specific deal. The only usage signal is inferable from the noun 'ledger'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_buyer_replyDraft a reply to a buyerA
Paste a buyer's message: detects intent (availability, offer, condition, logistics, hold, payment), extracts any offer, flags scam patterns, runs the negotiation engine within your floor/ceiling and rules, and drafts a reply. The thread is tracked for negotiation rounds. Returns a DRAFT needing your approval; buyer text is untrusted data.
| Name | Required | Description | Default |
|---|---|---|---|
| tone | No | ||
| buyer | Yes | ||
| message | Yes | ||
| listingId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring readOnlyHint=false, destructiveHint=false, and openWorldHint=false, the bar is lower, yet the description still adds real value: it discloses that the output is a DRAFT requiring human approval rather than a sent message, that negotiation state is persisted across rounds, and that buyer text is untrusted data (a prompt-injection warning). It stops short of stating permissions, rate limits, or what happens to an unapproved draft.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first front-loads the trigger ('Paste a buyer's message') with a compact pipeline, the second front-loads the critical return/behavior facts. Dense but no filler; the long enumerations of intents cost some readability without wasting much space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-step tool with no output schema and zero schema-level parameter documentation, the behavior side is well covered but the invocation side is not: an agent cannot learn from the description what listingId vs. buyer mean, what tone changes, or where the floor/ceiling/rules configuration is sourced. Adequate, but with a clear gap on inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 4 parameters, so the description must compensate and largely does not. It alludes to the message body and references 'your floor/ceiling and rules' — which are not parameters at all — while the roles of listingId, buyer, and the friendly/brief tone enum are never explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('drafts a reply') and enumerates the full internal pipeline: intent detection, offer extraction, scam flagging, negotiation engine, thread tracking. An agent can distinguish this from negotiate_offer (which computes rather than drafts) and send_dm (which sends rather than returns a draft) without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Paste a buyer's message' plus 'The thread is tracked for negotiation rounds' implies when the tool applies, and 'Returns a DRAFT needing your approval' implies the follow-on action. However, it never states when NOT to use it or names an alternative sibling (e.g., negotiate_offer, send_dm) for cases where drafting is the wrong step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_handoffDraft pickup/delivery arrangementBRead-only
Draft a pickup or delivery confirmation message (place, time, price, payment) with safety tips. Draft only.
| Name | Required | Description | Default |
|---|---|---|---|
| fee | No | ||
| mode | Yes | ||
| when | No | ||
| buyer | No | ||
| place | No | ||
| price | Yes | ||
| listingId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the non-mutating safety profile is covered. The description reinforces this with 'Draft only' and adds that the output includes safety tips, which is mild extra context, but it says nothing about idempotency, permissions, or what the drafted output looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no filler and the core action stated first. It is efficient, though arguably too terse given the tool's parameter surface.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, 0% schema coverage, and no output schema, the description should carry substantially more. It omits required listingId, the buyer field, and any return-format notes, so an agent lacks what it needs to invoke the tool confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full parameter burden, yet it names only place, time, price, and mode-like concepts. It omits listingId (a required parameter), buyer, and fee entirely, leaving required inputs undocumented in both schema and prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Draft) and resource (a pickup or delivery confirmation message) and enumerates the content it covers (place, time, price, payment). It does not explicitly distinguish itself from the close sibling draft_buyer_reply, though 'Draft only' signals it is a draft-generation tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'Draft only' implies the tool stops at drafting and that a separate action (e.g., send_dm) is needed to dispatch, which is useful implied guidance. However, it never states when to choose this over siblings like draft_buyer_reply or propose_deal, leaving the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_listingsList listingsCRead-only
List your listings by status.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds nothing further: it doesn't say whether results are paginated, what the default ('all'?) filter is, or how many listings are returned. For a simple read tool this is a minor gap, but zero added behavioral context keeps it low.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with the action and the filter front-loaded and zero filler. It is arguably too terse to be maximally informative, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is low-complexity, has no output schema to compensate for, and its annotations carry the safety profile, so the short description is roughly adequate. It still omits the default-status behavior and any sense of result scope, which an agent would need to call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the single parameter is a fully self-documenting enum (draft, posted, reserved, sold, withdrawn, all). The description's 'by status' confirms the parameter's role without adding syntax or default-value semantics, which is the minimum viable for one enum param.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource ('List your listings') and adds the scoping dimension ('by status'), which distinguishes it from the mutating siblings create_listing/update_listing/post_listing. It stops short of naming a sibling or clarifying how it differs from deal_ledger-style retrieval tools, so it lands at clear-but-undifferentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of alternatives such as the listing-mutation siblings, and no indication of what the default behavior is when 'status' is omitted. The phrase 'by status' hints at filtering but never states the context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
negotiate_offerTest an offer against your rulesARead-only
What-if: run the negotiation engine for an offer and round without recording anything. Never goes below floor; floor is never revealed in drafted text.
| Name | Required | Description | Default |
|---|---|---|---|
| offer | Yes | ||
| round | No | ||
| listingId | Yes | ||
| lastCounter | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description confirms 'without recording anything', which is consistent. It also adds non-annotation domain behavior: the engine never goes below the floor and the floor is never surfaced in drafted text, valuable constraint context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, the what-if scope is front-loaded, and every clause adds information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description never says what the simulation returns (e.g., a counter amount or accept/reject), and two of four parameters are undocumented. The floor constraint helps but the picture is incomplete for a 4-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, but it only echoes 'offer' and 'round' by name without format, range, or intent. 'listingId' and 'lastCounter' are left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete action: run the negotiation engine for an offer/round as a what-if, with no recording. That cleanly separates it from mutating siblings like propose_deal or approve_deal, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'What-if' framing implies this is a simulation to try before committing, which is useful context, but there is no explicit statement of when to use it versus propose_deal or deal_ledger, and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_listingPost listing to X (requires confirm + your token)A
Post the listing's text to X using the END USER's own OAuth 2.0 user token (X_USER_ACCESS_TOKEN, scope tweet.write). Without confirm:true returns the exact post preview. Photos are not uploaded by this tool; attach them in the X app or post manually.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| confirm | No | ||
| listingId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false) by disclosing that it uses the END USER's own OAuth token with scope tweet.write, that confirm:true is required to actually publish, and that photos are not uploaded. These are real operational constraints an agent could not infer from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and the credential requirement, with the preview behavior and photo limitation following in priority order. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema mutation tool, the description covers auth, the confirm gate, and a known limitation. It omits failure modes (X API rate limits, the 280-character platform limit versus the 1000-character schema cap) and whether a published post can be undone, which matters given openWorldHint=true.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains confirm well (preview vs. live post), but leaves 'text' (maxLength 1000) and 'listingId' unexplained — notably whether 'text' overrides the listing's stored text or whether it is required at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Post the listing's text to X') plus the credential context, which cleanly separates it from siblings like send_dm, create_listing, and draft_buyer_reply. The title and first sentence together make the operation unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Describes the two-phase flow explicitly: calling without confirm:true returns an exact preview, and confirm:true performs the post. That tells the agent when to use the tool in each mode, though it never names an alternative tool or states when not to use this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_dealPropose a deal (pending approval)A
Record an agreed price with a buyer as PENDING APPROVAL in the deal ledger. Nothing is accepted until approve_deal with confirm:true.
| Name | Required | Description | Default |
|---|---|---|---|
| buyer | Yes | ||
| notes | No | ||
| price | Yes | ||
| handoff | No | ||
| quantity | No | ||
| listingId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, but the description adds the key behavioral fact annotations cannot convey: the write creates a non-binding PENDING state and acceptance requires a separate confirm:true call. It does not state reversibility, auth requirements, or whether re-proposing overwrites an existing pending deal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler, front-loading the state semantics (PENDING APPROVAL) before the approval dependency. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The lifecycle and approval gating are well covered, but with six undocumented parameters, no output schema, and no detail on what an approval-gated proposal returns or how pending proposals are surfaced, the definition is only minimally adequate for the operation it describes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across six parameters, so the description carries the full burden and mostly fails it: it gestures at 'price' and 'buyer' but never explains listingId, quantity, notes, or handoff. Four of six fields remain undocumented anywhere, so it only marginally compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource: records an agreed price with a buyer into the deal ledger, and explicitly labels the resulting state as PENDING APPROVAL. It also names the sibling tool (approve_deal) that transitions the state, so an agent can distinguish propose from approve without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the workflow condition clearly: nothing is accepted until approve_deal is called with confirm:true, which tells the agent this is the pre-approval step. It does not, however, contrast with negotiate_offer or draft_handoff, leaving some ambiguity about when a proposal is preferable to continued negotiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_dmSend a DM to a buyer (requires confirm + your token)A
Send an approved reply as an X direct message using the user's own token (scope dm.write). Needs the buyer's numeric X user id. Without confirm:true returns a preview only.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| confirm | No | ||
| participantId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuinely useful behavior beyond the annotations: the call consumes the user's own token with dm.write scope, and omitting confirm:true yields a preview rather than a real send — the single most important safety fact here. It still says nothing about rate limits, failure modes, or whether a sent DM can be undone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero filler, front-loaded on what the tool does, then prerequisites, then the confirm behavior. Nothing repeats the title or restates the obvious.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation with no output schema, it covers purpose, prerequisites, auth scope, and the dry-run default, plus a hint at the return value ('a preview only'). Only error/idempotency behavior is left uncovered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It explains participantId ('buyer's numeric X user id') and, valuably, the confirm semantics (preview vs. actual send), but leaves text — including its 10,000-character bound — entirely to the schema. Two of three parameters get meaning, one does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Send an approved reply as an X direct message') with a stated prerequisite (approved reply, user's own token). It implicitly distinguishes itself from draft_buyer_reply by insisting the reply is already approved, but never names that sibling explicitly, so differentiation requires inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use: the reply must already be approved, the participant must be identified by numeric X user id, and confirm:true is the switch between preview and real send. It does not state exclusions (e.g., when to prefer drafting first), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_listingUpdate a listingC
Change price, floor, rules, status (e.g. withdrawn) or photos. Re-drafts the post text.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| ask | No | ||
| floor | No | ||
| rules | No | ||
| photos | No | ||
| status | No | ||
| ceiling | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive, closed-world mutation, and the description adds one genuinely useful trait beyond them: the post text is re-drafted as a side effect. However, it says nothing about partial-update semantics (what happens to fields left out), reversibility, or any side effects of status transitions like withdrawn/sold.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no filler; the mutation scope comes first and the side effect second. It is efficient, though the extreme brevity is closer to under-specification than to tight editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with a nested rules object, no output schema and no schema descriptions, the definition is too thin: it leaves the ceiling parameter unexplained, the rules sub-fields undefined, and partial-update behavior unstated. An agent could invoke it but could easily get semantics wrong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 7 parameters, including a nested rules object with 8 sub-properties, so the description carries the full burden. It only echoes a few English names (price, floor, rules, status, photos), omits 'ceiling' entirely, and explains none of the nested rule fields or their constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Change) plus the concrete resources it touches (price, floor, rules, status, photos) and adds the notable side effect that the post text is re-drafted. It does not name or contrast with siblings like create_listing or post_listing, so an agent must infer the boundary itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when/when-not guidance and no mention of the alternative tools (create_listing, post_listing, list_listings) or prerequisites such as needing an existing listing id. Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v1.0.0- First observed
approve_deal - First observed
create_listing - First observed
deal_ledger - First observed
draft_buyer_reply - First observed
draft_handoff - First observed
list_listings - First observed
negotiate_offer - First observed
post_listing - First observed
propose_deal - First observed
send_dm - First observed
update_listing
TDQS
Scored across 11 tools
Most tools have clearly distinct purposes: listing management, negotiation, deal approval, posting, and messaging are separated. The main overlap is draft_buyer_reply vs negotiate_offer, since both run the negotiation engine, but one records a thread and drafts a reply while the other is explicitly a non-recording what-if. Draft vs send boundaries (draft_handoff, send_dm, post_listing) are also clear from descriptions.
The set mostly follows a predictable snake_case verb_noun pattern: create_listing, update_listing, list_listings, draft_buyer_reply, negotiate_offer, propose_deal, approve_deal, post_listing, send_dm. The main deviation is deal_ledger, which is a noun-only read tool rather than verb_noun. The convention is still readable and largely consistent.
Eleven tools are well-scoped for an X marketplace seller workflow, covering listings, negotiation, deal approval, posting, DMs, and ledger review. Each tool appears to earn its place by handling a distinct step, with no obvious filler or redundant surface.
The surface covers the core seller lifecycle: create/update/list listings, draft buyer replies, negotiate offers, propose/approve/complete/cancel deals, post listings, send DMs, draft handoffs, and view the deal ledger. Minor gaps remain, such as no get_listing for a single listing, no permanent delete_listing (only withdrawal), no photo upload (explicitly manual), and no dedicated view of negotiation thread history.
Maintenance
Related MCP Connectors
Agentic commerce network: discover sellers and products, negotiate, and pay USDC on Base via x402.
Guarded agent surface for X & LinkedIn: discover, score, and draft in your voice. No key can post.
X/Twitter reads, search, monitors and posting. Pay-per-call in USDC — no signup, no API keys.
Sell to people and AI agents: create products, a storefront, and USDC payment links from chat.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with X (formerly Twitter), allowing for posting tweets, searching content, managing accounts, and organizing lists.10 npm3MIT
- AlicenseNot gradedqualityDmaintenanceEnables interaction with X (Twitter) to post tweets, threads, and replies while retrieving tweet metrics and account information. It supports core management tasks like deleting tweets and verifying authentication through the Twitter API.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to fully automate X/Twitter interactions including searching, posting, engaging, and managing multiple accounts without paid API keys.MIT
- AlicenseNot gradedqualityAmaintenanceA local-first MCP server for social publishing on X (Twitter), enabling draft management, scheduling, and posting via CLI or AI agents.41 npm5MIT