Skip to main content
Glama
Fabrica MCP Server

Fabrica MCP Server

Official
by fabrica-land

Fabrica MCP Server

Give AI agents access to US land on Fabrica. Search properties, research a parcel, check what it could borrow, and explore portfolios across the US land held on the Fabrica protocol.

What is this?

On Fabrica, a property is held in a trust; once its ERC-1155 token on Ethereum is issued, the token controls the trust, which holds title. This MCP server lets any AI agent query the full property catalog, lending market, and portfolio data, with no API keys required. A person can also connect their own Fabrica account (Connect Fabrica) so the agent reads their properties, offers and loans: the same server URL asks them to sign in and approve read-only access on fabrica.land the first time the agent needs it.

Built on the Model Context Protocol (MCP).

Related MCP server: Scalogy Real Estate Deals MCP Server

Quick Start

Point any MCP client at the hosted server:

Network

URL

Ethereum Mainnet (real parcels)

https://mcp.fabrica.land/mcp

Sepolia Testnet (test properties)

https://mcp-testnet.fabrica.land/mcp

No sign-in is needed for public data. Ask about your own properties, offers or loans and the client asks you to sign in to Fabrica and approve read-only access, then answers; disconnect any time in Connected apps on fabrica.land.

Claude (claude.ai and desktop): Settings → Connectors → Add custom connector → paste the URL.

Claude Code:

claude mcp add --transport http fabrica https://mcp.fabrica.land/mcp
claude mcp add --transport http fabrica-testnet https://mcp-testnet.fabrica.land/mcp

Cursor: one click installs the mainnet server:

Add Fabrica to Cursor

Or add it by hand (.cursor/mcp.json):

{
  "mcpServers": {
    "fabrica": { "url": "https://mcp.fabrica.land/mcp" }
  }
}

Any other client that supports remote MCP servers (Streamable HTTP) works the same way. Add both URLs as two separate servers if you want to try things on testnet before mainnet: the network is fixed per URL, so an agent can never reach mainnet through the testnet server.

Discovery without a registry: each host serves /.well-known/mcp.json (URL, transport, auth, docs, the other network's server) and /.well-known/mcp/server-card.json (the same plus every tool with its title and annotations, the prompts and the resource templates), plus /.well-known/ai-catalog.json, the AI Catalog that domain-level discovery reads first, pointing at both servers' cards. The card is read from the running server, so it always matches what that host registers.

Run locally (stdio)

The hosted URLs above are the supported way to use the server; it is not published to npm. To run it on your own machine from source (Node 20 or later):

git clone https://github.com/fabrica-land/fabrica-mcp.git
cd fabrica-mcp
npm install
npm run build
claude mcp add fabrica -- node /absolute/path/to/fabrica-mcp/dist/index.js

Set FABRICA_NETWORK=sepolia in the server's environment for the testnet.

Available Tools

Tool

Description

search_land

Search properties by state, county, size, Property checks, listing status, listing price and price per acre, or distance from a point; sort by price, price per acre, acres, estimated value, Property checks, date added or distance. Each row carries its lifecycle stage and price per acre; or counts per state or county, with links to the fabrica.land location pages

get_land_property

Full property details: legal, valuation, ownership, loans, media, lifecycle stage, assessed fees, duplicate-parcel flags

get_fabrica_lending_market

Lending overview: loan counts, loans, DeFi lending pool stats, average APR, events

get_fabrica_loan_book

The lending history as a distribution: loan-to-value bands, exposure by state and acreage, APR and duration spread, repaid and liquidated counts, originations by month, largest loans

get_land_portfolio

Wallet holdings, credit history, loan positions

get_fabrica_stats

Protocol-wide metrics: properties, estimated value, loan volume and counts, DeFi lending pool TVL

get_land_boundary

GeoJSON boundary data for mapping and spatial analysis

get_land_tax_status

Property tax status from Property checks (current, past due, unknown), its basis, check dates and whether it limits borrowing

get_land_trust_documents

The legal record: trust, trust agreement (name, version, link, text on request), legal description, parcel IDs, deed reference, uploaded documents

estimate_land_borrowing

Borrowing options for a property: DeFi lending pool liquidity, durations, current loans, what limits the amount (pool liquidity, LTV, tax status, oracle), why capacity is zero when it is, and what would raise it (toRaise: each lever, what it would allow, the step that moves it)

get_loan_against_land

One loan against a property: status, provider, principal, APR, maturity, full repayment and, while active, the payoff today; by property, loanId, or both

get_land_valuation

Every value the API holds for a property with its source, date and confidence: estimate, AVM, Prycd, county assessor, signed valuations, pool oracle state

get_land_activity

Activity feed for a property or wallet, or the recent activity across the whole network: transfers, loans, sales, properties added

get_land_order_book

Listings and offers on a property: prices, sellers and buyers, expiry, whether a loan blocks each listing, whether the property is still being added

explain_property_checks

Decode the numeric encoding of Property checks (5 digits, formerly called the confidence score) into verification groups

get_land_map_image

Static map image of a property's parcel boundary (inline, dark/light themes)

get_land_portfolio_map_image

Map image showing all properties owned by a wallet (inline, dark/light themes)

ask_fabrica

Cited passages from Fabrica's docs, help center and the US trust agreement that answer a question about how Fabrica works

find_us_parcel

Any US address or parcel number (APN) to a parcel: on Fabrica or not, and the link to add it; queries takes a list of up to 10 and returns a table. No owner names from parcel data; 30 lookups per minute per client, each query in a list counting as one

check_county_coverage

Whether property in a US county (or state) can be added online, and what it asks the owner for. From a table of Fabrica's rules for adding property, dated and refreshed by hand (npm run coverage:build)

contact_fabrica_support

Hand a question to Fabrica support: help center section, support email, and a prefilled mailto with the summary and property link. Sends nothing itself

Sign requests (testnet host first)

On mcp-testnet.fabrica.land (and on mainnet only with FABRICA_SIGN_REQUESTS=enabled), seven tools prepare actions: the marketplace's make_land_offer, list_land_for_sale, accept_land_offer, buy_land and cancel_land_order, and the DeFi lending pool's borrow_against_land (checks the wallet holds the token, no loan is active and the amount is within the pool's maximum) and repay_loan_against_land (checks the loan is active and the wallet is its borrower, with the payoff today). Each checks the live data (the property is live, the wallet holds it or not, the listing or offer is open, buyable and the wallet's own where it has to be), then returns a signRequest: a summary, warnings, a sign link to the property page on fabrica.land with the dialog prefilled, and an expiry 15 minutes out. The person opens the link and signs with their own wallet. The server holds no keys, signs nothing and submits nothing; payload (typed data or an unsigned transaction for a wallet in the conversation) stays null until Connect Fabrica ships. get_sign_request says whether a request was signed (it also checks the order book), and get_transaction_status follows a transaction by hash.

Pending requests live in the server's own store (Vercel KV / Upstash Redis: KV_REST_API_URL and KV_REST_API_TOKEN, plus SIGN_REQUEST_SECRET for the records' HMAC). The sign link is {web}/property/{network}/{tokenId}?action=…&request={id}. The sign page reads the request at GET /sign-requests/{id} (410 once expired) and reports the outcome at POST /sign-requests/{id}/result with { orderHash } or { transactionHash }, which the server checks against the API or the chain before recording. Without a store the tools say they are not configured; locally (stdio) an in-process map is used.

Knowledge layer

ask_fabrica answers questions about Fabrica (the trust, fees, Property checks, lending, taxes, adding and removing a property, the legal framework) from Fabrica's own text and returns the passages with their URLs, so an agent cites the page instead of paraphrasing from memory. Three sources feed it: docs.fabrica.land, the help center and the US trust agreement.

The index lives at src/knowledge/generated/index.json and is committed, so deploys and tests never fetch the sources at runtime. Retrieval is BM25 over passage text with titles weighted in and a small synonym list for Fabrica's vocabulary; there is no model call and no external service. To rebuild after the sources change:

npm run knowledge:build -- --docs-dir ../docs   # docs from a local checkout of fabrica-land/docs
GITHUB_TOKEN=... npm run knowledge:build        # or read the docs repo through the GitHub API
npm run knowledge:check                         # exit 1 when a source moved past its pin

Source pins (docs commit, help center sitemap fingerprint, trust agreement commit) are recorded in knowledge/sources.json. The build takes about 30 seconds and the index is under 1 MB.

A scheduled workflow (.github/workflows/refresh-knowledge.yml, daily and on demand) rebuilds the index, runs the tests and opens a pull request titled "Knowledge index: " whose body lists the pages added, removed and changed (scripts/knowledge-diff.mjs). Merging it deploys both servers. The workflow needs one repository secret, KNOWLEDGE_TOKEN, a fine-grained GitHub token with read access to the contents of the private fabrica-land/docs repository; a failed source fetch fails the run, so a partial index is never proposed.

Resources

The same documents are registered as MCP resources, so a person can attach one to a conversation from the client's resource picker (Claude's "add from connector", Cursor's @) without the agent searching for it. All are text/markdown, and every read starts with the source URL and the content's updated date.

URI

What it is

fabrica://docs/<slug>

Every docs.fabrica.land page (the ten most useful are listed first: obligations, fees, add and remove a property, Property checks, pool lending, the trust, the regulatory framework, the glossary, AI agents)

fabrica://help/<id>

Every help center article, by its article id and slug

fabrica://legal/us-trust-agreement

The US trust agreement text

fabrica://property/{tokenId}/trust-agreement

The operating agreement attached to one token, as the API serves it (versions differ by the date the token was issued)

fabrica://network

This deployment's network, contract addresses and legal notice

fabrica://docs/{slug} and fabrica://help/{id} are also resource templates with completion.

Prompts and skill file

The server offers four MCP prompts: due_diligence (one property, ending with what to verify yourself), work_parcel_list (a list of addresses or parcel numbers through find_us_parcel), wallet_review (holdings, loans and maturities) and how_to_add_land (adding one parcel to Fabrica). The same loops, the tool list and the legal red lines are in the Agent Skills file skills/fabrica/SKILL.md, served at https://mcp.fabrica.land/skill.md for agents that do not connect to the server.

Example Conversations

"Find me all tokenized properties in Texas"

"What's the current average APR on Fabrica's lending market? How much liquidity does the lending pool have?"

"Do a full due diligence report on property token 12743610130101631987"

"Show me the portfolio for wallet 0x23bc...fce4. What properties do they own?"

"Give me protocol-wide stats for Fabrica: how many properties, in which states, and total loan volume?"

"How much can I borrow against property token 12743610130101631987?"

"Show me all recent activity for wallet 0x23bc...fce4"

"What is property 3484741603659410548 listed for, and what offers are waiting on it?"

"Explain the Property checks number 73242. What does each digit mean?"

"Show me a map of property token 12743610130101631987"

"Show me a map of all properties in this wallet's portfolio"

Property card (MCP App)

In clients that support MCP Apps (such as Claude on the web and desktop), get_land_property renders a property card inline in the conversation:

  • a gallery with the parcel map first, followed by the owner's photos when there are any

  • name, location and acreage

  • Property checks, estimated value, listing price, and borrowing capacity

  • Buy (when listed), Make an offer, Contact owner and View on Fabrica buttons

Every button opens the property on Fabrica, where the user completes the action and signs; the server itself never prepares or submits a transaction. Clients without MCP Apps support receive the same data as JSON.

The agent can ask for the card fullscreen with display: "fullscreen"; the host may decline.

The card is on by default on Sepolia and off on mainnet unless FABRICA_MCP_APPS=enabled. Photos are limited to the origins the card's sandbox allows (see WIDGET_IMAGE_ORIGINS in src/tools/media.ts).

Network Selection

The hosted servers are split by URL (see Quick Start). A local server connects to Ethereum Mainnet by default, where properties represent real parcels of US land with real legal consequences. To experiment with test properties first, set FABRICA_NETWORK=sepolia:

Claude Code (Sepolia):

claude mcp add fabrica -e FABRICA_NETWORK=sepolia -- node /absolute/path/to/fabrica-mcp/dist/index.js

Claude Desktop (Sepolia):

{
  "mcpServers": {
    "fabrica": {
      "command": "node",
      "args": ["/absolute/path/to/fabrica-mcp/dist/index.js"],
      "env": { "FABRICA_NETWORK": "sepolia" }
    }
  }
}

Mainnet notice: On mainnet, the server instructions carry a legal notice stated as facts: the properties are real US land, each held in a trust; owning a token means owning the beneficial interest in the trust that holds the property; the trustee is designated by the token holder and is, by default, the holder; and acquiring, transferring, listing or borrowing against a token has legal, tax and liability consequences set out in the trust agreement attached to it.

Sepolia: Test properties only, no real-world implications.

Configuration

All optional; sensible defaults are built in:

Variable

Default

Description

FABRICA_NETWORK

ethereum

Network to operate on (ethereum or sepolia)

FABRICA_API_URL

https://api.fabrica.land/graphql

Fabrica GraphQL API

FABRICA_METASTREET_SUBGRAPH_URL

Auto-selected per network

Subgraph for the lending pool contracts (the variable keeps its original name)

FABRICA_MEDIA_URL

https://media.fabrica.land

Fabrica media service for map images

FABRICA_MCP_APPS

on for Sepolia, off for mainnet

enabled or disabled: the property card MCP App on get_land_property

Regression list

npm run regression (mainnet) or npm run regression -- sepolia calls every tool on a hosted server with the case list in scripts/regression/cases.json: happy paths, edge cases and the wording of a miss. One line per case, exit code 1 on a failure. Run it after each release and before a directory submission.

Hosting

The hosted servers run on Vercel from this repository: one Vercel project per network, both built with npm run build:vercel (see vercel.json), which emits a stateless Streamable HTTP function at /mcp, the sign-request endpoints at /sign-requests, the discovery documents at /.well-known/, and a landing page at /. Set FABRICA_NETWORK in each project's environment (ethereum or sepolia). The same handler (src/http.ts) can run behind any Node HTTP server.

MCP Registry

Both hosts are listed in the official MCP Registry as land.fabrica/mcp and land.fabrica/mcp-testnet (remote servers, no package). PulseMCP, Glama, the GitHub MCP registry and VS Code read from it. The entries live in server.json and server.testnet.json.

To republish after a release: bump version in package.json, src/server.ts and both server files (a test keeps them equal), then run npm run registry:publish (-- --dry-run prints the entries). Before writing anything it checks both entries against the registry: a version already there with the same content is skipped, so a rerun after a partial publish finishes the job, and one with different content stops the run. The namespace is proven by the v=MCPv1 TXT record on fabrica.land; the script reads the matching Ed25519 private key from MCP_REGISTRY_PRIVATE_KEY or ~/.config/mcp-registry/fabrica-land-ed25519.pem.

License

MIT

Available Tools

19 tools
ask_fabricaAsk FabricaA
Read-onlyIdempotent
Inspect

Answer questions about how Fabrica works from Fabrica's own published documents: docs.fabrica.land, the help center and the US trust agreement. Returns the best matching passages with their URLs, so an answer can be cited. Covers the trust structure, fees, Property checks, lending, property taxes, the onramp and offramp, the legal framework, the glossary and the MCP server itself. When the question names a specific property, wallet or listing, the result also suggests which lookup tool to call. Retrieval is lexical over a committed index, with no external call.

NameRequiredDescriptionDefault
sourceNoRestrict to one source: 'docs', 'help' (help center), 'trust-agreement', or 'all' (default)
questionYesThe question in plain language, e.g. 'Who is the trustee of the trust that holds my property?'
maxPassagesNoHow many passages to return (1-10, default 5)

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description goes further by disclosing the retrieval mechanism ('lexical over a committed index, with no external call') and the return shape ('best matching passages with their URLs, so an answer can be cited'). Minor gap: the 'suggests which lookup tool' behavior is mentioned but not detailed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, each earning its place: sources, return format, coverage areas, the property/wallet routing rule, and the retrieval mechanism. Slightly front-loading could improve, but no significant waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description appropriately describes what is returned (matching passages with URLs). It covers sources, return format, scope, and cross-tool routing. The main missing piece is guidance on what the returned passages look like in detail, but for a retrieval tool this is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents question, source (with enum values), and maxPassages. The description adds no syntax or format detail beyond naming the sources in prose. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (answer questions) and a well-defined scope: Fabrica's own published documents, explicitly enumerated (docs.fabrica.land, help center, US trust agreement). This is clearly a documentation-retrieval tool, distinct from every sibling which are all lookup/action tools (get_property, search_properties, etc.).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says when to use it (conceptual 'how does Fabrica work' questions) and, crucially, adds a routing rule: when the question names a specific property, wallet or listing, the result suggests which lookup tool to call. This links it to the sibling lookup tools and makes the boundary explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_coverageCheck on-ramp coverage for a countyA
Read-onlyIdempotent
Inspect

Whether a US county (or a whole state) can be added to Fabrica through the on-ramp: supported, notConfigured or unsupported, and for a supported county the deed and forms the owner signs (and which are notarized), witness requirements, the questions the owner is asked, and the on-ramp steps. Answers from a table of Fabrica's on-ramp rules as of 2026-10-16, refreshed by hand, so each answer carries that date; the on-ramp page is the live answer. Give a 5-digit county FIPS, or a two-letter state with or without a county. No fee amounts (ask_fabrica has them) and no owner data.

NameRequiredDescriptionDefault
fipsNo5-digit county FIPS code, e.g. '06065'
stateNoTwo-letter US state code, e.g. 'CA'
countyNoCounty name, e.g. 'Riverside' (with state)
ownerTypeNoWho holds title today: individual (default), entity or concurrent (co-owners)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive behavior, so the bar is lower, yet the description adds genuinely useful behavior: the data is from a hand-refreshed table as of 2026-10-16, each answer carries that date, and the live answer is the on-ramp page. It also discloses the boundary that no fee amounts or owner data are returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the answer (what coverage statuses mean), then outputs, then data provenance, then input format and exclusions. It is dense with useful content, though the long first sentence lists many outputs and could be tightened; no sentence is purely filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only coverage-lookup tool with no output schema, the description covers the status vocabulary (supported/notConfigured/unsupported), the fields returned for a supported county, data freshness/provenance, accepted input formats, and explicit exclusions. That is sufficient for an agent to call it correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents fips, state, county, and ownerType with patterns, examples, and an enum. The description reinforces input form ('5-digit county FIPS, or a two-letter state with or without a county') and notes ownerType implications indirectly, but adds little beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (check on-ramp coverage for a county/state) and enumerates exactly what the tool returns: coverage status, deed/forms, witness requirements, owner questions, and on-ramp steps. It is clearly distinguishable from the read-side siblings like get_property or find_parcel by naming the coverage concept.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly scopes inputs (5-digit county FIPS or a two-letter state with or without county), and explicitly excludes two adjacent concerns: 'No fee amounts (ask_fabrica has them) and no owner data.' This routes the agent to the right sibling for fees and pre-empts misuse of this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

contact_supportContact Fabrica supportA
Read-onlyIdempotent
Inspect

Hand a question to Fabrica's support team when the documents (ask_fabrica) do not answer it or a person is needed: a stuck onramp, a document question, a dispute. Returns the help center section for the topic, the support email address, and a mailto link that drafts an email with the summary and the property link. Nothing is sent by this tool; the person sends the email and replies come back by email. Summaries containing a private key or seed phrase are refused.

NameRequiredDescriptionDefault
topicNoHelp center section: getting_started, adding_property, buying_selling, borrowing_lending, trust_legal, troubleshooting, other (default)
summaryYesWhat the person is trying to do, what happened, and what was already checked
tokenIdNoToken ID of the property the question is about (digits only)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnly/openWorld/idempotent/non-destructive) by disclosing that nothing is actually sent, that the user sends the email, that replies come back by email, and that summaries containing a private key or seed phrase are refused. These are non-obvious behavioral facts an agent cannot derive from 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose and routing condition in the first clause, then adds return shape and the no-send/filtering caveats. Each sentence carries distinct information, though the run-on first sentence packs three concerns together, making it slightly dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still describes the return payload (help center section, support email, mailto link). Combined with usage routing, the no-send behavior, and the refusal rule, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents topic, summary, and tokenId including enums, length bounds, and pattern. The description adds the private-key/seed-phrase refusal rule tied to the summary, but otherwise the schema does the heavy lifting, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (hand a question to Fabrica's support team) and names the scope of what it escalates: a stuck onramp, a document question, a dispute. It explicitly distinguishes itself from the sibling ask_fabrica, so an agent can route between the two 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use conditions: when the documents (ask_fabrica) fail to answer, or when a person is needed. It names the alternative tool and the condition that selects against it, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

explain_confidence_scoreExplain Property checksA
Read-onlyIdempotent
Inspect

Explain a Fabrica property's Property checks from their numeric encoding (formerly called the confidence score; the tool name keeps it). The encoding is a 5-digit positional number where each digit represents a different verification group: recovery status (ten-thousands), past title (thousands), ownership (hundreds), onchain history (tens), basic validation (ones). Each digit is a category value, not a count; with a tokenId the response also counts the individual checks that pass. Max: 75342. Property checks are a starting point for your own research, not a title search or title insurance.

NameRequiredDescriptionDefault
scoreNoThe 5-digit Property checks number to explain, as an integer (e.g. 73242)
tokenIdNoLook up and explain the Property checks of this property

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds genuinely new behavior: that supplying tokenId triggers an additional pass-count in the response, the upper bound of 75342, and an explicit statement that results are not authoritative for title purposes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, then the digit legend, then the tokenId behavior, then the disclaimer — a sensible order. Dense but every sentence carries information; only the parenthetical about the old name is arguably trimmable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no required parameters, the description carries the burden and mostly does: it explains the encoding, the optional lookup behavior, and the conditional pass-count in the response. It stops short of describing the response shape when only a score is supplied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description goes beyond it by decoding the score's positional structure (ten-thousands = recovery status, thousands = past title, hundreds = ownership, tens = onchain history, ones = basic validation) and clarifying that each digit is a category value, not a count, plus the 75342 ceiling that the schema's generic maximum obscures.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — explain a property's Property checks from its numeric encoding — and immediately disambiguates the name from what it decodes ('formerly called the confidence score; the tool name keeps it'). No sibling tool does anything comparable, so an agent can route to it unambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: pass a numeric score to decode it, or a tokenId to have it looked up and counted. The closing disclaimer ('a starting point for your own research, not a title search or title insurance') sets expectations but is not a when-to-use-vs-alternative rule and names no sibling tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_parcelFind a US parcelA
Read-onlyIdempotent
Inspect

Resolve any US street address or parcel number (APN) to a parcel: address, place, APN, state and county, and whether it is already on Fabrica (token ID and property link). For a parcel not on Fabrica, links.addToFabrica is the fabrica.land on-ramp link for that parcel; it starts an on-ramp only when a person opens it and decides there. The tool itself creates nothing. An ambiguous query returns up to 5 candidates, whose Fabrica status is matched by parcel number only; state and county narrow it to one, which gets the full check. When the US parcel search is not answering, properties already on Fabrica that the query names come back from Fabrica's own records as unconfirmed candidates (match: unconfirmed, matchSource: fabrica-index); present them as likely, not confirmed. Owner names are never returned. Limited to 30 lookups per minute per client.

NameRequiredDescriptionDefault
queryYesStreet address (with city and state when known) or parcel number (APN)
stateNoTwo-letter US state code, e.g. 'AZ'
countyNoCounty name, e.g. 'Navajo'

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, idempotent, openWorld, non-destructive), it discloses the rate limit (30 lookups/minute per client), that the tool creates nothing, that ambiguous queries return up to 5 candidates matched by parcel number only, that a degraded search falls back to Fabrica's own records flagged 'match: unconfirmed, matchSource: fabrica-index', and that owner names are never returned. This is unusually rich behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and return fields, and every sentence carries operational weight (rate limit, fallback semantics, no owner names). It is one dense paragraph rather than a structured list, and a couple of clauses ('it starts an on-ramp only when a person opens it and decides there') are wordier than needed, keeping it off a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully carries the burden: it enumerates the returned fields (address, place, APN, state, county, token ID, property link), explains the candidate/ambiguity shape, and defines the unconfirmed fallback semantics. An agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: query accepts either a street address or an APN, and state/county are the tie-breakers that narrow an ambiguous result set to one parcel receiving the full Fabrica check. That interaction between parameters is not expressible in the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Resolve') and resource ('US street address or parcel number (APN) to a parcel'), then enumerates exactly what is returned. This clearly separates it from siblings like search_properties, get_property, and check_coverage, which an agent can distinguish 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives strong contextual guidance: address vs APN input, how state/county narrow an ambiguous query, what happens when the US parcel search is unavailable, and that links.addToFabrica only starts an on-ramp when a person acts on it. It does not explicitly name a sibling alternative (e.g. search_properties) or state when not to use this tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_activityGet activity historyA
Read-onlyIdempotent
Inspect

Get the activity feed for a property or wallet, or, with no tokenId, slug or address, the most recent activity across every property on the network: mints, transfers, sales, listings, loans started/repaid/liquidated, configuration changes, and more. Covers transaction history and event timelines.

NameRequiredDescriptionDefault
slugNoProperty slug (for property activity)
typeNoFilter by activity type (e.g. 'loan', 'transfer', 'sale', 'mint')
limitNoMax results (default 20, max 100)
addressNoWallet address (for wallet activity)
tokenIdNoProperty token ID (for property activity). Leave tokenId, slug and address out for the recent activity across every property on the network.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds genuine context beyond them: the breadth of event types returned and the important semantic that omitting all identifiers broadens scope to the whole network rather than erroring. It stops short of describing pagination or ordering of the feed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and scope before the long enumeration of event types. The second sentence ('Covers transaction history and event timelines') is largely redundant with the first, but the overall length is reasonable for a tool with three distinct modes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and full parameter documentation, the description covers what an agent needs to invoke it: the three scope modes and the event taxonomy. Gaps remain around result ordering and whether the feed is paginated, which matters for a history-retrieval tool but do not block correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are already documented, including the identical no-identifier fallback note on tokenId. The description repackages the property/wallet split but adds no syntax, format, or combination semantics beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the activity feed') and precisely delineates three scopes: property, wallet, and network-wide fallback when no identifier is supplied. The enumerated event categories (mints, transfers, sales, loans, liquidations, config changes) further pin down what 'activity' means. An agent can select this tool 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains the routing logic between the three modes: slug/tokenId for property activity, address for wallet activity, and nothing for network-wide recent activity. It does not, however, explain when to prefer this over adjacent tools like get_property or get_portfolio, nor does it state any exclusions or combined-filter behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_borrow_quoteGet borrow quoteA
Read-onlyIdempotent
Inspect

Get borrowing options for a specific tokenized property: DeFi lending pool liquidity (max loan amount, durations), existing loan status, the reasons when the pool shows no capacity (tax status, price oracle checks), and in limits what binds the amount (limitedBy: pool_liquidity, ltv, pool_limit, tax_status, oracle, existing_loan or unknown) with the collateral price, the pool's free liquidity and the highest loan-to-value. The oracle block shows how the collateral price is derived from the valuation sources. Answers questions such as 'How much can I borrow against this property?'. The amount is an estimate; the rate is set by a live quote when borrowing.

NameRequiredDescriptionDefault
slugNoProperty slug from the URL
tokenIdNoThe token ID of the property

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description only needs to add behavioral context — and it does: the amount is explicitly an estimate, the binding rate comes from a live quote at borrow time, and it explains why the pool may show no capacity (tax status, oracle checks). That is real added value beyond structured fields, though it doesn't discuss auth requirements or rate limiting.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first clause and the two closing sentences ('The amount is an estimate...') carry important caveats. The middle is a single heavy run-on sentence enumerating return fields and enum values, which is dense but largely earns its place given there is no output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full burden of describing returns, and it does so thoroughly: pool liquidity and max loan, existing loan status, no-capacity reasons, the limitedBy enum values, collateral price and LTV derivation. An agent has enough to interpret the response and set expectations about estimate vs. live rate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for both slug and tokenId, so the schema already carries parameter meaning. The description adds nothing about how slug vs tokenId are used or which is required, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'Get borrowing options for a specific tokenized property', then names the exact payload (pool liquidity, max loan, durations, existing loan status, limiting factors). This is clearly distinct from siblings like get_lending_market (market-level data) or get_valuation (property valuation), so an agent can route to it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an implied usage cue by stating the user question it answers ('How much can I borrow against this property?'), which helps an agent recognize the intent. However, it never states when NOT to use it or which sibling to prefer for adjacent questions (e.g. get_lending_market for pool-level rates), so guidance stays implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_lending_marketGet lending marketB
Read-onlyIdempotent
Inspect

Get an overview of the Fabrica lending market: loan counts, loans, DeFi lending pool liquidity and utilization, average APR, and recent loan events. Owners borrow against their properties through the DeFi lending pool (pool-based lending). Loan records also include historical peer-to-peer loans made through a former integration that is now retired.

NameRequiredDescriptionDefault
limitNoMax loan results (default 20, max 100)
sinceNoISO date. Only return loans started after this date.
lenderNoFilter by lender wallet address
statusNoFilter loans by status (default: 'all')
borrowerNoFilter by borrower wallet address

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is fully covered. The description adds useful domain context about pool-based lending and that historical retired P2P loans are included in records, but says nothing about result size, pagination behavior, or freshness/latency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with the payload description front-loaded, which is the right ordering. The second sentence is background framing rather than operational guidance, but it is short and does clarify an otherwise confusing data caveat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of explaining return contents and it does so enumeratively (counts, loans, liquidity/utilization, APR, recent events). Filtering and pagination semantics are left entirely to the schema, which is adequate here but leaves the aggregate-level vs list-level result shape ambiguous.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with limit, since, lender, status (enum), and borrower all documented in the schema. The description mentions none of these filters and adds no syntax or interpretation beyond what the schema already states, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('Get an overview of the Fabrica lending market') and enumerates what the overview contains: loan counts, loans, pool liquidity/utilization, average APR, and recent loan events. It is clear what the tool does, though it does not explicitly distinguish itself from near-siblings like get_protocol_stats or get_borrow_quote.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use statement, no exclusion, and no reference to any alternative tool despite several plausible overlaps (get_protocol_stats, get_borrow_quote, get_activity). The second sentence explains domain history (retired P2P integration) rather than telling the agent when to pick this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_order_bookGet order bookA
Read-onlyIdempotent
Inspect

Get the marketplace order book for one property: the lowest active listing, all listings, and offers sorted from highest to lowest, each with price in USD and in its currency, seller or buyer, expiry (ISO 8601 and relative), any buyer restriction and disclosure documents. Shows whether the property is a premint and whether it is collateral for an active loan, with what that means for a sale. Expired, canceled and filled orders are left out unless status is 'all'. Links to the property page, where offers are made.

NameRequiredDescriptionDefault
slugNoProperty slug from the URL
statusNo'active' (default): live orders only. 'all': also expired, canceled and filled orders.
tokenIdNoThe token ID of the property
minOfferUsdNoOnly return offers at or above this USD amount

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), yet the description still adds real behavioral context: expired/canceled/filled orders are hidden by default, offers are sorted descending, and the response surfaces premint status and whether the property is collateral for an active loan with implications for a sale. Only the vague 'with what that means for a sale' clause keeps it from 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause, and the long field enumeration is dense but informative for a tool with no output schema. It reads as one run-on inventory rather than cleanly separated sentences, which slightly hurts scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must describe the return payload, and it does so thoroughly: field-by-field contents, dual-currency pricing, seller/buyer role, ISO and relative expiry, buyer restrictions, disclosure documents, premint and loan-collateral flags. Nothing an agent needs to interpret the result is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including an explicit enum description for status, so the schema already carries the parameter burden. The description's mention that excluded orders reappear under status 'all' restates the schema rather than adding new semantics, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the marketplace order book for one property') and then enumerates exactly what it returns: lowest active listing, all listings, and offers sorted high-to-low with prices, counterparties and expiry. An agent can distinguish it from get_property, get_lending_market and search_properties 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the tool is for inspecting listings and offers on a given property, and 'links to the property page, where offers are made' hints at the follow-up workflow. It never names an alternative sibling or states prerequisites/exclusions relative to get_property or search_properties, so the agent must infer when this is the right call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_portfolioGet wallet portfolioA
Read-onlyIdempotent
Inspect

Get a wallet's Fabrica portfolio: properties owned (paged), active loans (as borrower or lender), marketplace orders, credit history, and total portfolio value. Counts and totals always cover the whole wallet.

NameRequiredDescriptionDefault
limitNoMax properties to list (default 50, max 200)
offsetNoProperties to skip, for paging (propertiesPage.nextOffset)
addressYesEthereum wallet address (0x...)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds a genuinely non-obvious behavioral fact: counts and totals always cover the whole wallet even though the property list is paged. It does not mention auth requirements, rate limits, or error behavior for invalid addresses, but with annotations carrying the safety profile this is solid added context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly packed sentences with zero filler, front-loading the resource and then the contents; the paging/totals caveat is placed immediately after the paged item it qualifies.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only aggregation tool with no output schema, the description does the essential work of enumerating the returned sections and explaining the paging/total relationship. It leaves minor gaps, such as behavior for a non-existent or non-contract address, but nothing an agent needs in order to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so limit and offset are already documented and the baseline is 3. The description adds meaning beyond the schema by noting the results are paged and, importantly, that pagination does not shrink the counts/totals — semantics an agent could not infer from the parameter descriptions alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (a wallet's Fabrica portfolio) and enumerates exactly what the portfolio contains: owned properties, active loans (borrower or lender), marketplace orders, credit history, and total value. This clearly separates it from siblings like get_property, search_properties, and get_lending_market.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the scope (one wallet, keyed by address) clear, which implicitly tells the agent to use it for wallet-level aggregation rather than per-property lookups. However, it names no alternatives and gives no explicit when-to-use/when-not-to-use guidance relative to siblings like get_lending_market or get_activity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_portfolio_imageGet portfolio map imageA
Read-onlyIdempotent
Inspect

Get a static map image showing all properties owned by a wallet, plotted as points on a single map. Returns an inline image. Supports dark/light themes and custom dimensions.

NameRequiredDescriptionDefault
themeNoMap theme (default: 'dark')
widthNoImage width in pixels (100-1280, default 640)
heightNoImage height in pixels (100-1280, default 640)
addressYesEthereum wallet address (0x...)

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description still adds real value by disclosing the return medium ('Returns an inline image'), which is absent from annotations and from any output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action and followed by output format and options; nothing is padded. The theme/dimension sentence mildly duplicates the schema but is not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 covers the return format (inline image) and the option surface, and annotations handle safety. It omits edge cases such as wallets with no properties or invalid addresses, but is otherwise sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so address, theme, width and height are already documented with ranges and defaults. The description restates theme and dimension support without adding syntax, units, or constraints beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope: a static map image of all properties owned by a wallet. The 'all properties owned by a wallet' framing implicitly separates it from get_property_image and get_property_map, but it never names those siblings explicitly, so an agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the scope phrase; there is no explicit when-to-use, when-not-to-use, or pointer to alternatives such as get_portfolio (data) versus this (visual). An agent can guess the intent, but nothing is stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_propertyGet property detailsA
Read-onlyIdempotent
Inspect

Get comprehensive details about a specific tokenized property on Fabrica (Ethereum Mainnet), including legal description, valuation, property tax status, Property checks (with their 5-digit numeric encoding), current ownership and holders, active loans, marketplace listings and offers, recent activity, photos and a parcel map image link. Also its lifecycle stage (premint, minted, removal in progress), fees assessed on the token with approval and payment state (fees is null when none are assessed), and flags for a duplicate parcel claim or the marketplace screen (an empty list when none apply). An old premint ID that was replaced by a minted token returns the successor. Boundary geometry is returned by get_property_map. The response includes the URL of the operating agreement (the trust instrument) that governs the token; get_trust_documents returns the full legal record.

NameRequiredDescriptionDefault
slugNoProperty slug from the URL
tokenIdNoThe token ID of the property

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds real behavioral detail beyond that: fees is null when none are assessed, flag lists are empty when none apply, and an old premint ID returns the successor token. It doesn't discuss auth requirements or pagination/volume, but the disclosure is well above the annotation baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the opening clause and the rest is organized as a return-content inventory plus scoping statements. It is long and enumerative but nearly every clause carries information the agent cannot get elsewhere (no output schema), with only mild redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full burden of describing returns and does so comprehensively: legal description, valuation, tax status, property checks encoding, ownership, loans, listings, activity, media, lifecycle stage, fee state, duplicate-claim flags, and successor-token behavior. Nothing an agent needs to call or interpret this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters (slug, tokenId) are documented in the schema, so the baseline of 3 applies. The description adds no parameter-level meaning, such as whether slug or tokenId is preferred or how they interact, so it neither helps nor hurts.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (retrieve comprehensive details about a specific tokenized property on Fabrica/Ethereum Mainnet) and explicitly distinguishes itself from two siblings, get_property_map (boundary geometry) and get_trust_documents (full legal record). An agent can select this over the near-neighbours 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Routing is provided by the two explicit boundary statements: boundary geometry lives in get_property_map and the full legal record in get_trust_documents, so the agent knows what this tool will and won't cover. It lacks an explicit 'use when you have a slug or tokenId' trigger and doesn't mention search_properties for discovery, so it's clear context without a complete when/when-not rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_property_imageGet property map imageB
Read-onlyIdempotent
Inspect

Get a static map image of a tokenized property showing its parcel boundary (or a pin marker if no boundary is available). Returns an inline image. Supports dark/light themes and custom dimensions.

NameRequiredDescriptionDefault
slugNoProperty slug from the URL
themeNoMap theme (default: 'dark')
widthNoImage width in pixels (100-1280, default 640)
heightNoImage height in pixels (100-1280, default 640)
tokenIdNoThe token ID of the property

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds genuinely useful behavior the annotations cannot convey: the response is an inline image, and a pin marker is substituted when no parcel boundary exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core purpose before the fallback and option details. The final sentence overlaps with what the schema already says about theme and dimensions, but it is brief and not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description usefully explains the return is an inline image, so that gap is covered. However, all five parameters are optional and the description never clarifies whether slug or tokenId is the identifying input, leaving an agent unsure how to form a valid call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema documents every parameter including enums, defaults and min/max ranges. The description only restates themes and custom dimensions generically, adding no syntax or default information beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: a static map image of a tokenized property, with the parcel-boundary behavior spelled out. It distinguishes itself from the sibling get_portfolio_image by scope (property vs portfolio), but does nothing to separate itself from get_property_map, which an agent could easily confuse with this one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No statement of when to choose this over get_property_map or get_property. The existence of closely named siblings (get_property_map, get_portfolio_image) makes an explicit routing rule valuable, and none is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_property_mapGet property boundary (GeoJSON)B
Read-onlyIdempotent
Inspect

Get GeoJSON boundary data for a tokenized property, for mapping, spatial analysis, and visualization. The county boundary is added only with includeCountyBounds: true.

NameRequiredDescriptionDefault
slugNoProperty slug from the URL
tokenIdNoThe token ID of the property
includeCountyBoundsNoAlso return the county boundary polygon, a large decorative layer (default: false)

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and openWorld, so the safety profile is fully covered without description help. The only behavioral statement — that county bounds require includeCountyBounds: true — merely restates the schema's own parameter description, adding little beyond structured data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly bounded sentences with the core purpose front-loaded and no filler. The second sentence is partially redundant with the includeCountyBounds schema description, which costs a point but not the structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only geo tool with strong annotations, the description conveys the return type (GeoJSON) adequately and no output schema is needed. The notable gap is that zero parameters are required, yet the description never clarifies whether slug, tokenId, or both are needed to resolve a property — the main decision an agent faces here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters, including the county-bounds flag and the large decorative layer caveat. The description adds no syntax, format, or relationship guidance (e.g., whether slug or tokenId is required) beyond the schema, matching the baseline for fully covered schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — retrieving GeoJSON boundary data for a tokenized property — which is clear and distinct from most siblings like get_property or get_valuation. However, it never differentiates itself from the spatially-related sibling find_parcel, so an agent choosing between boundary-lookup tools gets no help.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for mapping, spatial analysis, and visualization' gives implied usage context (when the caller needs geometry), but there is no explicit when-to-use versus find_parcel or get_property_image, and no exclusions or prerequisites stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_protocol_statsGet protocol statsA
Read-onlyIdempotent
Inspect

Get protocol-wide statistics for the Fabrica real property tokenization platform: total properties, estimated value, lending volume and loan counts, DeFi lending pool TVL and utilization, geographic distribution, and contract addresses.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety and determinism profile is covered. The description adds the useful detail that this is protocol-wide (not scoped) aggregation, but says nothing about freshness, caching, or cost despite openWorldHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence that front-loads the aggregating scope and then lists categories. The list is long but each item is a distinct returned metric, so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-param, well-annotated read tool with no output schema, the description is nearly complete: it enumerates what the aggregate contains. It stops short of explaining aggregation granularity or whether 'estimated value' is per-chain, but that is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so there is nothing to disambiguate and the baseline is high. The description correctly signals that the call needs no inputs via its protocol-wide framing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (protocol-wide statistics) for the named platform, and enumerates the exact categories returned (properties, value, lending volume, DeFi pool TVL, geography, contract addresses). This distinguishes it from query-shaped siblings like get_lending_market or search_properties.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: call it for a protocol-wide aggregate. But there is no explicit when-to-use vs. siblings like get_lending_market (which covers lending specifics) or get_valuation. An agent must infer the aggregation scope on its own.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tax_statusGet property tax statusA
Read-onlyIdempotent
Inspect

Get whether a tokenized property's taxes are current, past due or unknown, according to Fabrica's Property checks: the status, which signal it comes from (the Property Taxes Current check, the DeFi lending pool's block reason, both, or a note that they disagree), when it was checked and when the checks expire, and whether it limits borrowing. It is a data lookup, not the county's own statement; the amount due and the due date are not available.

NameRequiredDescriptionDefault
slugNoProperty slug from the URL
tokenIdNoThe token ID of the property

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds real value beyond that: the check's provenance ('Property Taxes Current check, the DeFi lending pool's block reason, both, or a note that they disagree'), expiry semantics, and the borrowing-limit implication.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core answer (current/past due/unknown) before the supporting detail, and every clause carries information about returned signals or scope limits. It is a long single sentence, but trimming it would remove genuinely useful distinctions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, yet the description effectively enumerates the return payload: status, signal source, check timestamp, expiry, and borrow impact. Combined with the explicit limitation about county amounts, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with only two parameters (slug, tokenId), both already documented in the schema. The description adds no parameter-level syntax or format detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (get) and resource (tax status) and enumerates the exact domain values returned: current, past due, or unknown. It is clearly distinguishable from siblings like get_property or get_valuation because it scopes to tax standing on a tokenized property.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the tool as 'a data lookup, not the county's own statement,' and states what is not available (amount due, due date), which sets expectations about when to rely on it. It does not, however, name an alternative sibling or state a when-not-to-use condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_trust_documentsGet trust documentsA
Read-onlyIdempotent
Inspect

Get the legal record of a tokenized property: the trust that holds it (holding entity, formation date), the trust agreement that governs the token (name, version, link), the legal description, the parcel identifiers (FIPS, APN, county, state), the recorded deed reference and grantor, and documents the owner uploaded. The agreement text is included only when includeAgreementText is true (it is long). Property checks are not a title search or title insurance. The token represents the beneficial interest in the trust; the trustee is designated by the token holder and is, by default, the holder.

NameRequiredDescriptionDefault
slugNoProperty slug from the URL
tokenIdNoThe token ID of the property
includeAgreementTextNoAlso return the full text of the trust agreement, about 150 KB (default: false; the link is always returned)

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/openWorld/no-destroy, so the bar is lower; the description still adds real behavioral context: agreement text is returned only when includeAgreementText is true because it is long, the token carries beneficial interest, and the trustee defaults to the holder. It does not mention auth requirements or rate limits, but the added domain caveats are substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the resource and its returned artifacts, and the practical gating detail (long agreement text, link always returned) is placed where it matters. It is somewhat long, and the closing sentences about beneficial interest and trustee designation are domain education rather than invocation guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the work of enumerating return fields and flags the one costly optional artifact, which is exactly what an agent needs. Only the absence of routing guidance against siblings leaves a small gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description only re-states the includeAgreementText gating condition already documented in the schema ('default: false; the link is always returned') and says nothing new about slug or tokenId, so it adds no meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the legal record of a tokenized property') and then enumerates exactly what is returned: trust, agreement, legal description, parcel identifiers, deed reference, and uploaded documents. This is far more informative than sibling 'get_property' and lets an agent distinguish the two without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the resource ('legal record of a tokenized property') and there is a useful scope caveat ('not a title search or title insurance'), but the description never says when to prefer this tool over get_property, get_tax_status, or find_parcel. No alternatives named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_valuationGet valuation sourcesA
Read-onlyIdempotent
Inspect

Get every value the Fabrica API holds for a property, each with its source, date and confidence: the estimate and the sources it comes from, the Fabrica AVM, Prycd and county assessor figures, the signed valuations the DeFi lending pool reads, the pool's oracle state (feed freshness, onchain price, usable price) with the reason when a price is missing, and the valuation report link. Presents data with its provenance; it suggests no price.

NameRequiredDescriptionDefault
slugNoProperty slug from the URL
tokenIdNoThe token ID of the property

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: the response carries provenance, dates and confidence, includes oracle feed freshness and a missing-price reason, and explicitly does not recommend a price.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and scoped by a single dense sentence; nearly every clause enumerates a distinct returned element, so little is wasted. It is long and clause-heavy, but the density is justified by the breadth of the payload.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description takes on full responsibility for describing return contents and does so comprehensively — value sources, dates, confidence, oracle state and report link. Nothing an agent needs to call or interpret the tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema documents both slug and tokenId, so the description carries no param burden. It adds no format, precedence or lookup-order guidance for the two identifiers, which is the baseline expectation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource and then enumerates exactly what 'every value' means: estimate, AVM, Prycd, county assessor, signed DeFi valuations, oracle state, report link. An agent can distinguish it from siblings like get_property or get_lending_market without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clarifies the tool's posture ('Presents data with its provenance; it suggests no price') but never states when to prefer it over alternatives such as get_property, ask_fabrica or explain_confidence_score, nor any prerequisites despite both parameters being optional.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_propertiesSearch propertiesA
Read-onlyIdempotent
Inspect

Search tokenized real properties on the Fabrica protocol (Ethereum Mainnet). Returns a list of properties matching the given filters, or counts per state or county with groupBy. When a state or county is given, the response includes the link to that location's page on fabrica.land. Each result is a real parcel of land in the US, held in a trust whose beneficial interest is an ERC-1155 token.

NameRequiredDescriptionDefault
limitNoMax results (default 20, max 100)
countyNoCounty name, case-insensitive, the 'County' suffix optional (e.g. 'Costilla' or 'Mohave County'). Combine with region when the name exists in more than one state.
offsetNoPagination offset
regionNoUS state code (e.g. 'TX', 'CA', 'NV')
groupByNoReturn one row per state or county (property count, count for sale, total acres, location page link) instead of property rows. limit and offset page through the groups.
ownedByNoFilter by owner wallet address
hasLoansNoOnly show properties with active loans
maxAcresNoMaximum parcel size in acres
minAcresNoMinimum parcel size in acres
minScoreNoMinimum Property checks number: the 5-digit numeric encoding of Property checks, an integer. Defaults to 72032, the marketplace threshold, except when ownedBy is set (then every property in that wallet is listed). Any minimum also requires a verified deed. Max: 75342.
hasListingsNoOnly show properties with active sale listings

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive, open-world behavior, and the description adds real context on top: results are US land parcels held in a trust tokenized as ERC-1155, and state/county results carry a fabrica.land location link. It doesn't cover pagination behavior for large result sets or any auth/indexing caveats, so it stops short of 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the core purpose, and each subsequent sentence adds something (count vs row behavior, location link, what a result actually is). No filler, though the trust/ERC-1155 explanation is slightly tangential to invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 11 optional parameters, no output schema, and no required fields, the description sensibly characterizes the two return shapes (property rows vs grouped counts) so the agent knows what comes back. It could say more about default pagination behavior, but nothing essential to a correct call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the nuanced minScore default and county/region combination rules, so the schema carries the parameter burden. The description echoes groupBy semantics but adds no new parameter-level detail, making 3 the correct baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search tokenized real properties on the Fabrica protocol') and scopes it to Ethereum Mainnet. It also distinguishes itself from the single-property sibling get_property by describing filter-based retrieval and grouped counts, so an agent can pick it 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the filter/groupBy description, but there is no explicit when-to-use guidance and no naming of alternatives such as find_parcel, get_property, or get_property_map. The agent must infer that this is the multi-result search entry point.

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.

  1. 19 tool updatesv0.1.0
    • First observedask_fabrica
    • First observedcheck_coverage
    • First observedcontact_support
    • First observedexplain_confidence_score
    • First observedfind_parcel
    • First observedget_activity
    • First observedget_borrow_quote
    • First observedget_lending_market
    • First observedget_order_book
    • First observedget_portfolio
    • First observedget_portfolio_image
    • First observedget_property
    • First observedget_property_image
    • First observedget_property_map
    • First observedget_protocol_stats
    • First observedget_tax_status
    • First observedget_trust_documents
    • First observedget_valuation
    • First observedsearch_properties

TDQS

A3.9/5.0

Scored across 19 tools

Disambiguation4/5

Most tools target distinct resources and actions (search, valuation, taxes, borrow quote, maps, images, order book, support), but there are a few overlapping pairs: search_properties vs find_parcel (both locate parcels) and get_property_map vs get_property_image (both deliver parcel geometry as different formats), plus heavy detail-overlap among get_property, get_trust_documents, get_valuation and explain_confidence_score. Descriptions do clarify the boundaries, so misselection risk is moderate rather than high.

Naming Consistency5/5

All 19 tools use consistent snake_case with a clear verb_noun structure (get_property, search_properties, check_coverage, ask_fabrica, find_parcel, contact_support). The verbs vary meaningfully by action rather than arbitrarily, and no camelCase or vague names break the pattern.

Tool Count4/5

19 tools is on the heavy side for a single server, but the Fabrica domain is genuinely broad (property search, legal/trust records, lending, valuation, marketplace, on-ramp, support) and nearly every tool maps to a distinct read need. It is defensible, though a couple of image/map tools could plausibly be merged.

Completeness4/5

Read coverage is strong: lookup, valuation, tax, lending quotes, portfolio, activity, order book, trust documents, coverage checks and support are all present. The main gap is transactional actions — no tools to place offers, list, or initiate a borrow — but the server appears intentionally read-only and links out to the web for those flows.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to access verifiable DePIN supply-side telemetry, browse and purchase data products using credits, query datasets, and verify data provenance with cryptographic and zero-knowledge tools.
    10
    91 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to query and analyze self-hosted real-estate public-records data through 20 read-only MCP tools, including property search, foreclosure and distress signals, comps, market context, and optional license-gated deal scoring.
    MIT