Skip to main content
Glama
cexplayer01

dfwmetro-mcp

by cexplayer01

dfwmetro-mcp

A local Model Context Protocol (MCP) server for dfwmetro.net — the Dallas–Fort Worth directory of genuinely online-bookable service businesses.

Give your AI agent three tools:

Tool

What it does

find_listings

Search the directory. Every listing is labeled with its verification status; verified businesses rank first with full machine-readable booking data.

find_verified_listings

Strict search: VERIFIED businesses only — license, registration, and insurance checked by the dfwmetro verification desk.

submit_listing

Submit a DFW business to the directory. It must be genuinely online-bookable (a real date/time scheduling flow — not a quote form, not phone-only). Accepted submissions start as NOT_YET_VERIFIED and pass human review.

Why this exists

dfwmetro.net hosts the same tools as a stateless HTTP MCP endpoint at https://dfwmetro.net/mcp. Many MCP clients, though, launch a local process over stdio. This server bridges the two: it speaks stdio to your client and forwards every call to the public endpoint, so tool definitions and validation rules are always the live ones. No API key, no database, no secrets — it only ever talks to dfwmetro.net's public machine API.

Requires Node.js 18+. Zero dependencies.

Related MCP server: moltline-mcp

Quick start

node server.mjs

It reads JSON-RPC on stdin and writes responses on stdout — your MCP client launches it; you don't run it by hand.

Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "dfwmetro": {
      "command": "node",
      "args": ["/path/to/dfwmetro-mcp/server.mjs"]
    }
  }
}

Any other MCP client

Point the client at node /path/to/dfwmetro-mcp/server.mjs as a stdio server.

Prefer the hosted endpoint?

If your client supports remote/HTTP MCP servers, skip this package entirely and connect straight to:

https://dfwmetro.net/mcp

Other machine surfaces on dfwmetro.net: GET /api/bridge/discover for discovery JSON, /llms.txt for the agent guide, and /.well-known/dfwmetro-agent.json for the agent registry entry.

Configuration

Env var

Default

Meaning

DFWMETRO_MCP_URL

https://dfwmetro.net/mcp

Override the remote endpoint (testing only).

The listing rule

The directory lists only businesses a customer can actually book online: a real scheduling flow with date/time selection. Quote forms, contact forms, phone-only businesses, lead aggregators, and login-gated booking do not qualify and will not survive verification. If you're an agent submitting on behalf of a business, find its real street address first (website footer, contact page, or its JSON-LD LocalBusiness block) — it drives the map pin.

License

MIT — see LICENSE. The directory data itself is served by dfwmetro.net under the terms in its /llms.txt.

Available Tools

3 tools
find_listingsA

Find service businesses in the dfwmetro.net directory for booking. Returns every listing with its verification status labeled: VERIFIED businesses (human verification-desk reviewed) rank first and carry machine-booking capability and endpoint health; NOT_YET_VERIFIED businesses are clearly labeled, ranked by automated pre-check score, and carry machine_ready:false. Pass verified_only:true for the strict VERIFIED-only shelf. This tool can never change verification status.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoDFW city filter, e.g. 'Plano'.
limitNoMax listings to return (1-50).
tradeNoCategory id from https://dfwmetro.net/categories.json, e.g. 'plumbing'. Legacy display labels ('Plumbing', 'Heating & Air Conditioning', 'Electrical') are also accepted and normalized.
subcategoryNoSubcategory label filter, e.g. 'Drain cleaning'.
verified_onlyNoTrue returns only VERIFIED listings (the strict premium shelf); false (default) returns all listings with verification status labeled, VERIFIED ranked first.

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does reasonably well: it discloses the read-only guarantee ('can never change verification status'), the ordering behavior (VERIFIED ranked first, pending ranked last), and the machine_ready:false flag on unverified rows. It omits pagination, rate limits, and whether results are truncated by the default limit.

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 sentences, front-loaded with the purpose, and each clause carries substantive information about ranking and labelling. It is somewhat redundant with the near-verbatim input-schema description, which costs a point.

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 and no annotations, the description compensates by explaining the shape of the response (verification labels, ranking order, machine_ready flags, endpoint health), which is exactly what an agent needs to interpret results. The read-only guarantee covers the missing safety annotations.

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 five parameters, including the verified_only default and the city/trade/limit semantics. The description restates the verified_only meaning but adds no syntax or format detail beyond the schema, so 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?

The description states a specific verb and resource ('Find service businesses in the dfwmetro.net directory for booking') and scopes it to a named directory. It does not name the sibling find_verified_listings, which overlaps heavily with the verified_only:true mode, so an agent must infer the boundary rather than being routed explicitly.

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?

It offers one actionable usage cue ('Pass verified_only:true for the strict VERIFIED-only shelf') and frames the intent as booking-related discovery, but never says when to choose this tool over find_verified_listings, whose purpose appears to be exactly that shelf.

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

find_verified_listingsA

Find VERIFIED service businesses in the dfwmetro.net directory for booking. Only listings that passed human verification-desk review are returned — this tool can never surface unverified businesses and can never change verification status. Each result includes the business's booking_url plus machine-booking capability and endpoint health when known. Use booking_url for human-style booking flows; use capability endpoints only when present. Kept for backward compatibility; new integrations should prefer find_listings with verified_only:true.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoDFW city filter, e.g. 'Plano'.
limitNoMax listings to return (1-50).
tradeNoCategory id from https://dfwmetro.net/categories.json, e.g. 'plumbing'. Legacy display labels ('Plumbing', 'Heating & Air Conditioning', 'Electrical') are also accepted and normalized.
subcategoryNoSubcategory label filter, e.g. 'Drain cleaning'.
verified_onlyNoTrue returns only VERIFIED listings (the strict premium shelf); false (default) returns all listings with verification status labeled, VERIFIED ranked first.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose key traits: it is strictly read-only ('can never surface unverified businesses and can never change verification status') and it enumerates returned fields (booking_url, machine-booking capability, endpoint health). It omits auth requirements, rate limits, and pagination behavior, so it is strong but not exhaustive.

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 sentence, followed by behavior and then routing guidance, with no filler sentences. It is slightly dense across four sentences but each one carries distinct information.

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 tool with no output schema and no annotations, the description covers what an agent needs: verified-only scope, immutability of verification status, and the shape of each result. It could say more about result volume or ordering, but nothing essential 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%, so all five parameters are already documented in the schema, and the description adds no syntax or format detail beyond the verified_only:true example for the sibling tool. 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+resource (find VERIFIED service businesses) and scopes it to the dfwmetro.net directory for booking. It explicitly distinguishes itself from the sibling find_listings by noting it is the legacy verified-only path, so an agent can tell the two apart 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 routing: 'new integrations should prefer find_listings with verified_only:true,' and tells the agent which field to use for which flow ('use booking_url for human-style booking flows; use capability endpoints only when present'). Both the when-to-use and the alternative are named.

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

submit_listingA

Submit a DFW service business to the dfwmetro.net verified directory. The business MUST be genuinely online-bookable: booking_url must point at a real scheduling flow (date/time picker or booking widget) — quote forms, contact forms, phone-only, and login-gated flows fail verification. You do not need to categorize it yourself: describe what the business does in 'description' and the trade is assigned automatically (send 'trade' only if you are sure of the category id). Find the business's real street address BEFORE submitting — check its website (footer/contact page) or the JSON-LD LocalBusiness block on its site or booking page — and send it as 'street_address': it drives the exact map pin. When the trade requires a state license (plumbing, electrical, HVAC, personal & specialty services), also send 'license_number' (e.g. 'TACLA40925C', 'TECL 12345', 'M-12345') — the server pre-checks the format and the human desk verifies it against the state registry. You may also send 'starting_price_cents' (integer cents, e.g. 8500 = $85.00, shown publicly as 'from $X') and 'price_note' (short qualifier, e.g. 'per visit'). Accepted submissions start as NOT_YET_VERIFIED and pass human review before going live.

ParametersJSON Schema
NameRequiredDescriptionDefault
dbaNoTrade/DBA name shown publicly. Defaults to legal_name.
cityYesDFW city, e.g. 'Plano'.
phoneNo
tradeNoOPTIONAL. Category id from https://dfwmetro.net/categories.json (e.g. 'plumbing', 'electrical', 'personal_specialty'). Pre-v2 ids (e.g. 'nail-salon') are accepted and stored as their v2 industry. If omitted, the server assigns the trade from your description — you do not need to get this right yourself.
websiteNo
zip_codeNo
legal_nameYesLegal business name.
price_noteNoOPTIONAL. Short qualifier shown next to the starting price, e.g. 'per visit', 'up to shoulder length'.
booking_urlYesREQUIRED. Direct URL of the business's real online scheduling flow (date/time picker or booking widget). Generic contact/quote forms, phone-only, and login-gated flows fail verification — do not submit them.
descriptionNoWhat the business DOES, in plain words (e.g. 'mobile piano tuning, in-home appointments'). Used to categorize the listing when trade is omitted, and shown to the verification desk. The more specific, the better the categorization.
service_areaNoDefaults to 'DFW'.
submitted_byNoAgent identifier, e.g. 'agent:my-booking-bot'. Defaults to 'agent:unknown'.
subcategoriesNoMust match the trade's subcategory labels in categories.json.
license_numberNoSTRONGLY RECOMMENDED when the trade requires a state license (plumbing, electrical, HVAC, personal & specialty services). The trade's license number, e.g. 'TACLA40925C' (HVAC), 'TECL 12345' (electrical), 'M-12345' (plumbing). The server checks the format against the Texas pattern; the human desk verifies it against the state registry before VERIFIED.
street_addressNoSTRONGLY RECOMMENDED. The business's real street address, e.g. '2818 Satsuma Drive'. Find it on the business's website (footer / contact page) or in the JSON-LD LocalBusiness block on its site or booking page BEFORE submitting. It drives the exact map pin; without it the listing gets only a city-level dot. Not required — submissions without it are still accepted.
years_in_businessNo
license_type_detailNoFree-text license detail, e.g. 'Master Plumber' or 'Class A ACR Contractor'. Shown to the verification desk alongside license_number.
starting_price_centsNoOPTIONAL. Starting price in cents, e.g. 8500 = $85.00. Shown publicly as 'from $X'. Omit when pricing varies too much to quote a starting point.

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that submissions start as NOT_YET_VERIFIED, go through human review, that the server pre-checks license format, and that trade is auto-assigned. It omits what happens on duplicate submissions of the same business (idempotency) and any rate limits, which are real behavioral concerns for a write tool.

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 purpose and the hard requirement, then the optional-parameter guidance; every sentence is substantive. It is a single dense paragraph and re-states some schema-documented parameter rules near-verbatim, which is mild redundancy rather than 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?

For an 18-parameter mutation tool with no annotations and no output schema, the description covers the verification lifecycle, the critical booking_url constraint, and the highest-value optional fields. It does not describe the response returned (submission id, status echo) or duplicate handling, which are the remaining gaps.

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 78%, so the schema already documents most fields. The description goes beyond it by explaining the concrete effect of key optional params — street_address 'drives the exact map pin,' starting_price_cents renders publicly as 'from $X', price_note is a qualifier, and it supplies real license_number examples per trade.

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 precise verb and resource ('Submit a DFW service business to the dfwmetro.net verified directory') and immediately scopes what counts as valid, making it unmistakable against the read-only find_verified_listings/find_listings siblings. An agent knows exactly what this tool does from the first clause.

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?

Explicit when-to-use and what-disqualifies: booking_url must point at a real scheduling flow, and quote forms, contact forms, phone-only and login-gated flows 'fail verification.' It also gives the precondition sequence (find the real street address BEFORE submitting) and when license_number is expected, which is unusually actionable guidance.

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. 3 tool updatesv1.0.0
    • First observedfind_listings
    • First observedfind_verified_listings
    • First observedsubmit_listing

TDQS

A3.9/5.0

Scored across 3 tools

Disambiguation3/5

submit_listing is clearly distinct from the two search tools, but find_verified_listings is fully subsumed by find_listings (the description itself says it's kept only for backward compatibility and recommends find_listings with verified_only:true). The descriptions do explicitly call out the relationship, which mitigates but does not eliminate misselection risk between the two finders.

Naming Consistency5/5

All three tools follow a clean verb_noun snake_case pattern: submit_listing, find_verified_listings, find_listings. The find_ prefix is applied predictably and no conventions are mixed.

Tool Count3/5

Three tools is thin for a directory service, and effectively only two distinct capabilities exist since find_verified_listings duplicates a mode of find_listings. The scope is narrow enough that it is defensible, but it sits at the borderline of under-provisioned.

Completeness3/5

Submit plus search covers the core loop, but there is no way to retrieve a single listing by id, no explicit status-check for a submission the caller just made, and no update/correct path despite submissions starting as NOT_YET_VERIFIED. Agents can partially work around this by filtering find_listings, but there are notable dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An agent-callable MCP server that lets autonomous AI agents find, verify, message, schedule with, and transact with small and mid-sized businesses through a single compliance-enforced tool surface.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Zero-dependency stdio bridge to Moltline Studio's fleet of 14 hosted MCP servers covering code review, time operations, data transforms, business ops, education, research, outreach and more. Free tier requires no registration; premium tools unlock with a license. Independently audited, MCPize Verified A.
    10
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables agents to search evidence-backed startup credits and deals, inspect Agent Readiness report cards, and prepare canonical declaration YAML from a stdio bridge to Sourcey's hosted MCP endpoint.
    8
    36 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables MCP clients to search the web and fetch individual pages through two stdio tools, returning ranked results or extracted page content, titles and outbound links. It wraps a hosted, API-key-authenticated service (or a local daemon) with zero runtime dependencies.
    14 npm
    MIT