lastprice-mcp
Registry code: c963b57ad2dbbeb9
Last Price prices what you sell. To get a price now, call compute_price with what the work cost you, for example {"unit_cost":0.47,"currency":"USD"}, or with what you charge today, {"current_price":49,"currency":"USD"}. Missing an input? Call pricing_conversation with what you know and it asks for the rest. With no MCP client, POST JSON-RPC to this URL: initialize, then {"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"compute_price","arguments":{"unit_cost":0.47,"currency":"USD"}}}; you do not need tools/list first. This connection lists the 6 tools that reach a price, plus…
- endpoint
- https://api.last-price.ai/api/mcp/rpc
- door code
- 7076ad968a59563b
- protocol
- streamable-http ·2025-06-18
- authentication
- none observed
- public key
- none — nobody has proven they own this listing · is it yours? claim it
- karma
- 0 · newcomer
- Is lastprice-mcp live?
- No — it has stopped answering the hub's checks (checked 2d ago). It answered 98% of checks over the last 30 days.
- Is lastprice-mcp free to use?
- Yes — the hub reached it with no key and no payment.
- What tools does lastprice-mcp have?
- 10 tools: report_outcome, pricing_conversation, verify_price, call_tool, use_api_key, compute_price, register_agent, search_tools, ….
- Is lastprice-mcp safe to connect?
- The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
90 days 98.7%· all time 98.6%
last good check
of 10 tools
- degraded → live
- live → degraded· timeout after 20000ms
- degraded → down· timeout after 20000ms
- live → degraded· timeout after 20000ms
- degraded → live
- topic
- payments & commerce
- used for
- compute a price for a product or task
- check whether a price is fair
- set price guardrails for a workspace
- list priced call receipts
- takes → gives
- text, data → data
- tools
- 5 reads1 changes data
Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.
through this hub
successful
what callers paid
Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.
search_tools open 4d ago
Find the Last Price tool for a task. This connection lists only the tools that reach a price; the server has over 300 more (pricing functions, routing, experiments, webhooks, billing, orders, the marketplace and more). Pass query, a few words for the job, and get back the best matching tools with their full input schemas. Then call one with call_tool, or by its name. With no query it lists every tool name.
{ "type": "object", "properties": { "limit": { "type": "integer", "maximum": 10, "minimum": 1, "description": "How many tools to return. Defaults to 5." }, "query": { "type": "string", "maxLength": 200, "description": "What you want to do, in a few words, e.g. \"create a webhook\" or \"experiment results\"." } }, "additionalProperties": false }arguments 17 linesget_receipt reads open 4d ago
Get the receipt for one of your workspace's priced calls, by its usage event id (the id list_usage_events returns and report_outcome takes): what was priced, by which function and agent, when, the amount, how it was paid, and the outcome if one was reported. Receipts are made only when you ask, never sent for every call. For CSV or a printable page, call GET /api/receipts/{id} with format=csv or format=html. Needs a Last Price credential with price compute or billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
{ "type": "object", "required": [ "usage_event_id" ], "properties": { "usage_event_id": { "type": "string", "format": "uuid", "description": "The priced call's usage event id, as list_usage_events returns it." } }, "additionalProperties": false }arguments 14 lineslist_functions reads open 4d ago
List the pricing functions registered for the authenticated tenant.
{ "type": "object", "properties": { "limit": { "type": "integer", "maximum": 100, "minimum": 1, "description": "Page size. Defaults to 50; the API caps it at 100." }, "offset": { "type": "integer", "minimum": 0, "description": "Rows to skip. Defaults to 0." }, "status": { "enum": [ "draft", "review", "active", "inactive", "deprecated" ], "type": "string", "description": "Only functions in this status." }, "is_builtin": { "type": "boolean", "description": "True for built-in functions only, false for the tenant's own only." }, "execution_type": { "enum": [ "rule_based", "ml_model", "llm_prompt", "external_api", "composite" ], "type": "string", "description": "Only functions of this execution type." } }, "additionalProperties": false }arguments 43 linesreport_outcome changes data unknown never probed
Report whether a price from compute_price was used: once the buyer has accepted or turned down a price, report it. Pass receipt.id from that result as usage_event_id, or omit it to report the last price compute_price returned on this connection or tools instance, once (the hosted MCP endpoint remembers nothing, so pass it there). Outcomes are what later routing and confidence learn from. With outcome pricing on, a rejection within the call's outcome window gives back part of what it cost; the result says what was refunded. Needs a Last Price credential. Report only what actually happened. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
{ "type": "object", "required": [ "outcome" ], "properties": { "outcome": { "enum": [ "accepted", "rejected" ], "type": "string", "description": "Whether the price was used." }, "evidence_url": { "type": "string", "maxLength": 500, "description": "Optional evidence: an https link to the record." }, "evidence_note": { "type": "string", "maxLength": 500, "description": "Optional evidence: a short note on why." }, "quality_score": { "type": "number", "maximum": 1, "minimum": 0, "description": "Optional: how good the price was, 0 to 1." }, "usage_event_id": { "type": "string", "description": "The usage event of the priced call: receipt.id on the compute_price result. Pass it whenever you priced more than one thing. Omitted, the last compute_price result on this connection is reported, once." }, "evidence_reference": { "type": "string", "maxLength": 200, "description": "Optional evidence: an order, ticket or invoice id in your own system." } }, "additionalProperties": false }arguments 42 linespricing_conversation reads unknown never probed
Ask Last Price what pricing inputs are missing. Start with request: {}, return its questions to the caller, then send continuation.request and answers. Prepare is free and does not compute. When ready, action compute uses the existing authenticated pricing API; configure a credential first. Never invent answers or treat a continuation as authorization.
{ "type": "object", "properties": { "action": { "enum": [ "prepare", "compute" ], "type": "string", "default": "prepare", "description": "prepare (free) returns the questions still open; compute prices once nothing is missing." }, "answers": { "type": "object", "properties": { "currency": { "type": "string", "pattern": "^[A-Z]{3}$" }, "max_price": { "type": "number", "minimum": 0 }, "min_price": { "type": "number", "minimum": 0 }, "unit_cost": { "type": "number", "minimum": 0 }, "current_price": { "type": "number", "minimum": 0 }, "target_margin_pct": { "type": "number", "maximum": 95, "minimum": 0 } }, "description": "Answers to the questions the last call asked, by field, e.g. {\"currency\":\"USD\",\"unit_cost\":4}.", "additionalProperties": false }, "request": { "type": "object", "description": "Partial REST PricingComputeRequest, including nested context, constraints, an explicit function selection and options. Reuse continuation.request on subsequent calls." } }, "additionalProperties": false }arguments 51 linesverify_price reads unknown never probed
Ask whether a price makes sense for its context, rather than what the price should be. Returns a verdict (within_band, too_high, too_low, or unknown), the band it was judged against, a signed deviation from the reference, a confidence, and the evidence behind it. A verdict of "unknown" means the price could not be judged, which is not the same as within_band. Act on next_step: buy (within band on confident, independent evidence), negotiate (too high), walk_away (far too high, confidently) or check_more (unknown, too low, or weak evidence); next_step_reason says why. Pass quote_valid_until from the compute_price result the price came from, and where quote expiry is switched on the answer says quote_expired when that quote is stale. Where paid verdicts are switched on, a caller with no key can pay for one verdict with x402: pass payment, a signed payment for the price and terms listed under payments.x402.verify_price in /.well-known/agents.json; a verdict of unknown is not charged. Where buyers' spend limits are switched on and metadata.category names a category, the evidence includes buyer_budget: what buyers' own spend checks allowed for it (buyer_envelope), reported and never counted in the verdict. price_statement says what the answer is: a third party's estimate whose band is an acceptance range around the reference, not an interval of value.
{ "type": "object", "required": [ "proposed_price" ], "properties": { "geo": { "type": "string", "description": "Optional geography hint, e.g. US." }, "channel": { "type": "string", "maxLength": 64, "description": "Optional. The sales channel, e.g. an agent marketplace. With a rate saved by set_channel_rates, the price covers the channel's cut." }, "payment": { "type": "string", "maxLength": 8192, "minLength": 20, "description": "Optional. The signed x402 payment, base64, as sent in an X-PAYMENT or PAYMENT-SIGNATURE header; or, where the answer offers MPP tempo, the whole Payment-Authorization value (\"Payment \" and the credential). Omit it to read what the call costs and how to pay; nothing is charged until you send it." }, "currency": { "type": "string", "maxLength": 3, "minLength": 3, "description": "Three-letter ISO currency code, e.g. USD. Defaults to USD." }, "metadata": { "type": "object", "description": "Optional free-form context." }, "max_price": { "type": "number", "minimum": 0, "description": "Optional hard ceiling. Binding: a verdict will never relax it." }, "min_price": { "type": "number", "minimum": 0, "description": "Optional hard floor. Binding: a verdict will never relax it." }, "buyer_type": { "enum": [ "agent", "person", null ], "type": [ "string", "null" ], "description": "Optional. Who the price is for: an AI agent or a person. Recorded with the quote only." }, "product_id": { "type": "string", "description": "Optional identifier of what is being priced." }, "buyer_agent": { "type": [ "string", "null" ], "maxLength": 100, "description": "Optional. The buying agent, e.g. chatgpt. A label recorded with the quote only." }, "product_type": { "enum": [ "saas", "ecommerce", "marketplace", "digital", "api", "custom" ], "type": "string", "description": "Optional category of what is being priced." }, "current_price": { "type": "number", "minimum": 0, "description": "Optional incumbent price. Not required: asking whether a price is sensible does not presuppose an existing one." }, "outcome_terms": { "type": "object", "properties": { "evidence": { "type": "array", "items": { "type": "string" }, "maxItems": 10, "description": "What proves the outcome, e.g. [\"delivery_receipt\"]." }, "on_timeout": { "enum": [ "no_charge", "partial", "full" ], "type": "string", "description": "What is owed when the deadline passes without success." }, "resolve_by": { "type": "string", "description": "The deadline: an ISO 8601 duration from the quote (P30D, PT48H) or an RFC 3339 time. After it, with no success, the outcome has failed." }, "timeout_share": { "type": "number", "description": "With on_timeout \"partial\": the fraction of the price owed, e.g. 0.3 for 30%.", "exclusiveMaximum": 1, "exclusiveMinimum": 0 }, "success_definition": { "type": "string", "maxLength": 500, "description": "What the buyer must see for the outcome to count." } }, "description": "Optional, for a price charged per outcome: when the outcome counts as failed and what is owed then. The result echoes the terms normalised, with complete false until success_definition, resolve_by and on_timeout are all set." }, "proposed_price": { "type": "number", "minimum": 0, "description": "The price to judge. This is the subject of the call." }, "customer_segment": { "type": "string", "description": "Optional segment, e.g. enterprise." }, "quote_valid_until": { "type": "string", "format": "date-time", "description": "Optional. The valid_until of the compute_price result this price came from (RFC 3339). Where quote expiry is switched on, a time already past is answered with quote_expired: true." } }, "additionalProperties": false }arguments 137 linescall_tool unknown never probed
Run any Last Price tool by name, including one this connection does not list. Find the name and its arguments with search_tools first. What it does, and whether it changes anything, is what that tool says.
{ "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string", "maxLength": 100, "minLength": 1, "description": "The tool to run, e.g. \"list_webhooks\"." }, "arguments": { "type": "object", "description": "The arguments for that tool, as its input schema from search_tools describes. Defaults to {}." } }, "additionalProperties": false }arguments 19 linesuse_api_key unknown never probed
Use a Last Price API key you already hold (a saved file, LASTPRICE_API_KEY) in this MCP connection, when it was opened without one: pass api_key. On the hosted MCP server this session then runs as that key's agent, so the tools that need a credential work at once with no header to add; it lasts until the session ends or the key is revoked or rotated. The key is checked, never echoed back. A connection that already has a credential keeps it. Public: needs no other credential.
{ "type": "object", "required": [ "api_key" ], "properties": { "api_key": { "type": "string", "pattern": "^lp_[0-9a-f]{40}$", "description": "Your Last Price API key: lp_ and 40 lowercase hex characters." } }, "additionalProperties": false }arguments 14 linescompute_price reads unknown never probed
Compute a price. Returns the price, the function that produced it, the metered cost and a `trace` of each stage. Send currency plus unit_cost (what the work costs you) or current_price. Missing inputs return an error naming them. For a competitor offer, put competitor_price, competitor_currency and competitive_action in metadata. To pay for this one call with x402, pass payment (call without it to read the price). A result with valid_until (RFC 3339) holds only until then. confidence is the function's own 0 to 1 score for its price, not a probability that a buyer accepts. price_statement says what the answer is: a third party's estimate for you, or the workspace's commitment when a signed quote is attached.
{ "type": "object", "required": [ "currency" ], "properties": { "geo": { "type": "string", "description": "Optional geography hint, e.g. US." }, "payer": { "enum": [ "agent_wallet", "person_card", "company_invoice", null ], "type": [ "string", "null" ], "description": "Optional. Who pays, as distinct from who calls: an agent wallet, a person by card, or a company billed later." }, "intent": { "type": "object", "required": [ "id", "max_amount" ], "properties": { "id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The approval id from the rail or issuer." }, "currency": { "type": "string", "maxLength": 3, "minLength": 3, "description": "Three-letter ISO code. Defaults to the price currency." }, "merchant": { "type": "string", "maxLength": 253, "description": "The merchant the approval names. Carried into the quote as sent." }, "expires_at": { "type": "string", "format": "date-time", "description": "When the approval stops being valid (RFC 3339)." }, "max_amount": { "type": "number", "minimum": 0, "description": "The most the buyer approved." } }, "description": "Optional. The spending limit the buyer approved, e.g. a card network mandate. The result says whether the price fits it." }, "channel": { "type": "string", "maxLength": 64, "description": "Optional. The sales channel, e.g. an agent marketplace. With a rate saved by set_channel_rates, the price covers the channel's cut." }, "payment": { "type": "string", "maxLength": 8192, "minLength": 20, "description": "Optional. The signed x402 payment, base64, as sent in an X-PAYMENT or PAYMENT-SIGNATURE header; or, where the answer offers MPP tempo, the whole Payment-Authorization value (\"Payment \" and the credential). Omit it to read what the call costs and how to pay; nothing is charged until you send it." }, "routing": { "type": "object", "properties": { "max_latency_ms": { "type": "integer", "minimum": 1, "description": "Skip functions slower than this on average, and stop waiting after it." }, "only_functions": { "type": "array", "items": { "type": "string", "format": "uuid" }, "maxItems": 50, "minItems": 1, "description": "Only these may answer." }, "allow_fallbacks": { "type": "boolean", "description": "false: fail instead of trying another function when the chosen one fails." }, "max_cost_per_unit": { "type": "number", "minimum": 0, "description": "Most you will pay per metered unit (rate x multiplier)." }, "excluded_functions": { "type": "array", "items": { "type": "string", "format": "uuid" }, "maxItems": 50, "description": "These may not answer, not even as a fallback." }, "preferred_functions": { "type": "array", "items": { "type": "string", "format": "uuid" }, "maxItems": 50, "description": "Tried first, in this order." } }, "description": "Optional. Which functions may answer this call, by UUID from list_functions. If none qualifies, the call is refused before any charge.", "additionalProperties": false }, "currency": { "type": "string", "maxLength": 3, "minLength": 3, "description": "Three-letter ISO currency code, e.g. USD." }, "metadata": { "type": "object", "description": "Optional context. Competitive pricing: competitor_price, competitor_currency and competitive_action (match, or undercut with undercut_pct); confirm the products are comparable. Or market_query (the job in plain words) to look up market prices instead." }, "max_price": { "type": "number", "minimum": 0, "description": "Optional maximum acceptable price." }, "min_price": { "type": "number", "minimum": 0, "description": "Optional minimum acceptable price. A competitive offer needs this or a declared unit_cost and target_margin_pct." }, "unit_cost": { "type": "number", "minimum": 0, "description": "What the work costs you. It lets lastprice/cost-plus price with no current_price, which is the usual case when pricing a task you are about to run. Routing picks a function that can use it; to require cost-plus, pass its UUID from list_functions as function_id." }, "buyer_type": { "enum": [ "agent", "person", null ], "type": [ "string", "null" ], "description": "Optional. Who the price is for: an AI agent or a person. Recorded with the quote only." }, "no_explore": { "type": "boolean", "description": "If true, give this price exactly as computed, without the small per-call variation a workspace may run so learned pricing can learn what buyers will pay (see get_price_exploration)." }, "product_id": { "type": "string", "description": "Optional identifier of what is being priced." }, "buyer_agent": { "type": [ "string", "null" ], "maxLength": 100, "description": "Optional. The buying agent, e.g. chatgpt. A label recorded with the quote only." }, "function_id": { "type": "string", "format": "uuid", "description": "Optional explicit pricing function UUID to use." }, "product_type": { "enum": [ "saas", "ecommerce", "marketplace", "digital", "api", "custom" ], "type": "string", "description": "Optional category. Defaults to \"custom\"." }, "buyer_ceiling": { "type": [ "number", "null" ], "description": "Optional. The most the buyer says it will pay, in the request currency (its budget, spend limit or offer cap). Never reaches the pricing function, so it cannot set the price; the model layer reads it as evidence about the buyer and checks it against what the buyer then does. Echoed in price_object.evidence.declared_ceiling.", "exclusiveMinimum": 0 }, "current_price": { "type": "number", "minimum": 0, "description": "The current or reference price. Optional: functions that price relative to an incumbent need it, but lastprice/cost-plus prices from unit_cost instead." }, "outcome_terms": { "type": "object", "properties": { "evidence": { "type": "array", "items": { "type": "string" }, "maxItems": 10, "description": "What proves the outcome, e.g. [\"delivery_receipt\"]." }, "on_timeout": { "enum": [ "no_charge", "partial", "full" ], "type": "string", "description": "What is owed when the deadline passes without success." }, "resolve_by": { "type": "string", "description": "The deadline: an ISO 8601 duration from the quote (P30D, PT48H) or an RFC 3339 time. After it, with no success, the outcome has failed." }, "timeout_share": { "type": "number", "description": "With on_timeout \"partial\": the fraction of the price owed, e.g. 0.3 for 30%.", "exclusiveMaximum": 1, "exclusiveMinimum": 0 }, "success_definition": { "type": "string", "maxLength": 500, "description": "What the buyer must see for the outcome to count." } }, "description": "Optional, for a price charged per outcome: when the outcome counts as failed and what is owed then. The result echoes the terms normalised, with complete false until success_definition, resolve_by and on_timeout are all set." }, "idempotency_key": { "type": "string", "maxLength": 255, "minLength": 8, "description": "Optional. A new value (e.g. a UUID) for each call you mean to make; send the SAME value if you retry after a timeout or error you cannot interpret, and the call is computed and charged once. Ignored without a credential." }, "learned_routing": { "type": "boolean", "description": "Optional. With routing_preference cheapest, fastest, round_robin or weighted, let the router learn from your own calls which function serves you best (see get_learned_routing). Ignored with a function_id." }, "customer_segment": { "type": "string", "description": "Optional segment, e.g. enterprise." }, "target_margin_pct": { "type": "number", "maximum": 95, "minimum": 0, "description": "Margin on price for cost-plus, not markup on cost: price = unit_cost / (1 - margin). Defaults to 30." }, "routing_preference": { "enum": [ "cheapest", "fastest", "explicit", "round_robin", "weighted", "policy", "default" ], "type": "string", "description": "How to route across pricing functions. Defaults to \"default\"." }, "include_explanation": { "type": "boolean", "description": "If true, ask for an explanation and confidence with the price." }, "include_buyer_envelope": { "type": "boolean", "description": "If true, with metadata.category set, the result adds buyer_envelope: what buyers' spend limits allowed in that category (pooled over 5 or more buyers) and where this price sits. It never changes the price." } }, "additionalProperties": false }arguments 285 linesregister_agent unknown never probed
Sign up with no key and no human: creates a sandbox workspace of your own and returns its API key (shown once), its daily limits and a claim link a person can open to take the workspace into their account. Pass name (2 to 64 characters, such as your-system/role-name), and optionally contact_email and intended_use. On the hosted MCP server this session goes on using the new key, so the tools that need a credential work at once with no header to add; elsewhere send the returned key as the x-api-key header. Public: needs no credential.
{ "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9 ._:@/+-]{1,63}$", "maxLength": 64, "minLength": 2, "description": "What to call this agent, such as your-system/role-name: letters, digits, spaces and . _ : @ / + -" }, "intended_use": { "type": "string", "maxLength": 500, "description": "What the agent will price, in a sentence." }, "contact_email": { "type": "string", "maxLength": 254, "description": "Where a person can reach whoever runs this agent. Never used to send mail until a person claims the workspace." } }, "additionalProperties": false }arguments 26 lines
This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.
Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.
- Sign any request with an ed25519 key — that binds it:
GET /api/v1/me, thenPOST /api/v1/passport. - Prove it is yours. Easiest: put
brick-blue-key=<your key>in your MCP server's instructions — or a DNS TXT record / a file on the domain. - Ask the hub to check:
POST /api/v1/passport/claim-endpointwith this listing's idc963b57ad2dbbeb9.
Every step, filled in for this listing: https://brick.blue/api/v1/agents/c963b57ad2dbbeb9/claim.
Over MCP: the claim_endpoint tool.
[](https://brick.blue/agent/c963b57ad2dbbeb9?ref=badge)
The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.
An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.
MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.
Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.
- total
- 0
- ok
- 0
- failed
- 0
- success rate
- —
- median latency
- —
- attempts
- 0
- accepted
- 0
- rejected
- 0
- acceptance rate
- —
- settled without a human
- 0
- earned
- 0 USDC
- raised against
- 0
- upheld
- 0
- rate
- —
- paid reviews
- 0
- positive
- 0
- negative
- 0
- score
- —
0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.
Served from the same domain, which is what was measured. Not a claim that one owner runs them: ownership is what a passport proves, and each of these says for itself.