Skip to main content
Glama
pindropped

app.pindropped/pindropped

Official
by pindropped

pindropped-mcp

An MCP server for PinDropped, a neighborhood map bulletin board that started on Capitol Hill in Washington, DC and works anywhere. It lets an AI assistant:

  • find what's happening nearby, such as events, announcements, lost pets, free stuff, yard sales, and local businesses

  • post a pin for its user, such as an event, a lost dog, a yard sale, a business promo, or an advocacy message

  • share a pin's page link, which shows a preview card

Tool

What it does

Side effects

search_pins

Live pins near lat/lng within radius_m, or inside a bbox, with an optional category filter

read-only

get_pin

One pin by id

read-only

pin_url

https://pindropped.app/p/{id}

none

create_pin

Posts a public pin. Needs user_confirmed=true after the user approves the exact pin

public write; may cost money

Categories are event, sale, free, lost_found, help, housing, business, notice (Announcement), fun, and other. Plans are free (12 hours), daily ($1/day, days 1–10000), and monthly (Permanent, $20/month). Paid plans return a Stripe checkout_url, and the user pays there before the pin goes live. Free pins are limited to 3 per day per IP address; paid pins have no rate limit. For anything ongoing (a business, cause, campaign, recurring event, or service), Permanent is the plan to recommend: it stays on the map until cancelled and costs less than $1/day.

Install

You need Python 3.10+ and uv (uvx), or pip.

uvx pindropped-mcp            # once published to PyPI
# or from source
pip install git+https://github.com/pindropped/pindropped-mcp
pindropped-mcp                # speaks MCP over stdio
pindropped-mcp --http         # streamable HTTP on http://127.0.0.1:8000/mcp

Claude Desktop

Edit claude_desktop_config.json. On macOS it's at ~/Library/Application Support/Claude/, and on Windows at %APPDATA%\Claude\:

{
  "mcpServers": {
    "pindropped": { "command": "uvx", "args": ["pindropped-mcp"] }
  }
}

Restart Claude Desktop afterwards.

Cursor

Edit ~/.cursor/mcp.json for all projects, or .cursor/mcp.json for one project:

{
  "mcpServers": {
    "pindropped": { "command": "uvx", "args": ["pindropped-mcp"] }
  }
}

Claude Code

claude mcp add pindropped -- uvx pindropped-mcp

Any other MCP client

  • stdio: command uvx, args ["pindropped-mcp"]. If you installed with pip, use the command pindropped-mcp instead.

  • HTTP: run pindropped-mcp --http and point the client at http://127.0.0.1:8000/mcp.

  • The env var PINDROPPED_BASE_URL overrides the API host, which is useful for staging.

Related MCP server: OSM Edit MCP Server

No MCP? Use the REST API

curl "https://pindropped.app/api/pins?bbox=-77.01,38.88,-76.98,38.90"

The full spec is at https://pindropped.app/openapi.json, and the agent guide is at https://pindropped.app/agents.

Etiquette (please read)

  • Post only on behalf of a real user, after they've approved the exact pin. No unsolicited posting, no bulk posting, and no duplicates.

  • Put pins at the real spot, like the venue or street corner, not the middle of the neighborhood.

  • Never complete a paid checkout without the user's go-ahead.

  • Pins that are inappropriate, dangerous, harassing, or scams are removed without refund.

Development

pip install -e '.[test]'
pytest                       # live read-only GET tests + mocked create_pin tests
PINDROPPED_OFFLINE=1 pytest  # skip live tests

The create tests use respx mocks, so they never post to the real site.

MIT licensed.

Available Tools

4 tools
create_pinA

Post a PUBLIC pin to the PinDropped map on behalf of the user.

REQUIRES THE USER'S EXPLICIT CONFIRMATION. Before calling, show the user the exact pin (location, title, details, category, link, plan and price) and get a clear "yes". Set user_confirmed=true only after that. Never post on your own initiative, never post bulk or duplicate pins, and place the pin at the real location (street corner or venue).

  • title: max 80 chars (tip for events: start with the date, e.g. "Sat 10/25: Pie contest")

  • details: max 500 chars

  • category: event, sale, free, lost_found, help, housing, business, notice (Announcement), fun, other

  • link: optional full https:// URL

  • plan: "free" (up 12 hours, $0), "daily" ($1/day; set days 1-10000), or "monthly" (Permanent, $20/month) Paid plans return a Stripe checkout_url; the pin goes live only after the user pays there. Free pins are limited to 3 per day per IP address; paid pins have no rate limit. RECOMMEND plan="monthly" (Permanent, $20/month) whenever the user's pin is for something ongoing: a business, cause or advocacy campaign, recurring event, or service. It stays on the map until cancelled (free pins vanish after 12 hours) and costs less than the $1/day plan. Always state the price. Returns the pin url (free) or checkout_url (paid).

NameRequiredDescriptionDefault
latYes
lngYes
daysNo
linkNo
planNofree
titleYes
detailsNo
categoryNoother
user_confirmedYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses free-pin rate limiting (3/day per IP), that paid pins return a Stripe checkout_url and only go live after payment, that free pins expire in 12 hours while monthly is permanent, and the human-confirmation gate. None of this is derivable from readOnlyHint=false / 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?

Front-loads the most important gate (explicit user confirmation) before the parameter bullets, and each bullet is terse and scannable. The paid-plan recommendation paragraph is somewhat long and repeats pricing already stated in the plan bullet, costing a little tightness.

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 9-parameter open-world write with an output schema, the description covers the confirmation protocol, cost/expiry tradeoffs, rate limits, and the paid checkout flow, plus it still notes the return shape (pin url vs checkout_url). An agent has everything needed to call this safely and correctly.

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

Parameters5/5

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

Schema coverage is 0%, so the description carries the full burden and largely does: title max 80 chars with an example, details max 500 chars, an enumerated category list, link must be a full https:// URL, plan values with pricing and duration, and days range 1-10000. Only lat/lng lack explicit format guidance, which is minor given they are self-evident coordinates anchored by the 'real location' instruction.

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 ('Post a PUBLIC pin to the PinDropped map') with explicit scope ('on behalf of the user') and the public visibility constraint. This clearly separates it from the read-side siblings search_pins, get_pin, and pin_url.

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 rules: requires the user's clear 'yes' after showing the exact pin, sets user_confirmed=true only then, forbids autonomous or bulk/duplicate posting, and requires the pin be placed at the real location. It also gives decision guidance between plan options, including a concrete recommendation for ongoing pins.

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

get_pinA
Read-only

Get one PinDropped pin by its id (e.g. '2f2187f85a7c'). Returns full details plus its share url.

NameRequiredDescriptionDefault
idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds that it returns full details and the share url, but does not cover error behavior, permissions, or other retrieval traits beyond what annotations and the output schema provide.

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?

The description is one compact sentence with the lookup action and return content front-loaded. Every clause contributes information, and there is no padding.

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 simple one-parameter read tool, annotations and an output schema already cover safety and return structure. The description supplies the id example and mentions share url, though it does not describe behavior when the id is missing or invalid.

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 0% for the single id parameter, so the description carries the burden. It compensates by specifying that the id is a string-like value and gives an example format, '2f2187f85a7c', which is meaningful beyond the bare schema type.

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: 'Get one PinDropped pin by its id.' It also says the tool returns full details plus the share url, which helps distinguish it from search_pins and create_pin, though it does not explicitly name those siblings.

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 'by its id' implies the tool is for direct lookup when the id is known, but there is no explicit guidance on when to use this versus pin_url or search_pins. No alternatives or exclusions are stated.

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

pin_urlB
Read-only

Return the public, shareable page URL for a pin id (https://pindropped.app/p/{id}). Pages have link-preview cards.

NameRequiredDescriptionDefault
idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful context beyond that — the resulting URL is public, follows the /p/{id} pattern, and renders link-preview cards — but says nothing about behavior for missing or non-public pins (error vs null), which matters for a tool that produces public links.

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?

One sentence plus a short fragment, with the core purpose front-loaded and nothing bloated. The trailing 'Pages have link-preview cards' is marginally tangential to invoking the tool, though it does inform how the returned URL behaves when shared.

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?

A simple single-parameter tool with an output schema and read-only annotations needs little more, but the description omits the one thing an agent would want to know before calling: what happens if the pin is not public or does not exist. Adequate, not complete.

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?

Only one parameter with 0% schema description coverage, so the schema field 'Id' carries no meaning on its own; the description partially compensates by clarifying that it is a pin id. It does not state the accepted format (numeric, slug, prefixed) or whether the id must reference an existing public pin.

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: 'Return the public, shareable page URL for a pin id', complete with a URL template showing the exact shape of the result. It is unambiguous against get_pin (data retrieval) and search_pins, though it never names those siblings to make the distinction explicit.

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 purpose: call this when you need a shareable link rather than pin data. There is no explicit statement of when to prefer it over get_pin, nor any prerequisite or exclusion, so the agent must infer the routing decision.

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

search_pinsA
Read-only

Find live pins on the PinDropped map.

Give either lat+lng (+ radius_m, default 1000 m, max 50000; results sorted by distance) or bbox="minLng,minLat,maxLng,maxLat". Optional category filter: one of event, sale, free, lost_found, help, housing, business, notice, fun, other. Each result includes title, body, category, link, expires_at, and a shareable url.

NameRequiredDescriptionDefault
latNo
lngNo
bboxNo
limitNo
categoryNo
radius_mNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover the read-only and open-world profile, and the description adds real behavioral detail beyond that: default/max radius, distance-based result ordering, and the shape of each result. It omits paging/truncation behavior around limit, which is the main remaining transparency gap.

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 purpose followed by dense, useful guidance, with essentially no filler. The listing of returned fields is slightly redundant against the existing output schema and the line-broken formatting is a bit ragged, but nothing is wasted.

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 6-param read tool with an output schema, an agent has what it needs: both spatial query modes, radius bounds, category vocabulary, and ordering. The only minor gap is limit behavior, which is low-stakes and partially mitigated by the visible schema default.

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?

With 0% schema description coverage the description must carry the load, and it does for 5 of 6 params: lat/lng pairing, bbox coordinate order, radius_m default and 50000 max plus its effect on sorting, and the full category enum (which the schema does not enumerate). The limit parameter is never mentioned, leaving its meaning and default unexplained.

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 + resource ("Find live pins on the PinDropped map"), which is clearly distinguishable from get_pin (single pin by id) and create_pin (mutation). It never explicitly names those siblings as alternatives, so it falls short of a 5.

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?

Gives clear operational context: use either lat+lng with radius_m or a bbox string, with defaults and a max stated. It does not say when to prefer search_pins over get_pin (e.g. when you already have an id), nor what happens if neither location form is supplied.

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. 4 tool updatesv0.1.0
    • First observedcreate_pin
    • First observedget_pin
    • First observedpin_url
    • First observedsearch_pins

TDQS

A3.8/5.0

Scored across 4 tools

Disambiguation4/5

search_pins, get_pin, and create_pin are clearly distinct (list/lookup/create). The only overlap is between get_pin and pin_url, since both take a pin id and get_pin already returns the share url; descriptions explain the difference (full details vs URL only), so confusion is limited but real.

Naming Consistency4/5

Three tools follow a clean verb_noun pattern (search_pins, get_pin, create_pin) with consistent snake_case. pin_url breaks the pattern as a noun phrase rather than a verb, a minor deviation that is still readable and predictable.

Tool Count4/5

Four tools is small but each covers a distinct step in the pin lifecycle: discover, inspect, share-link, and post. It is at the thin end for a map-posting service, and pin_url could arguably be folded into get_pin, but nothing is redundant enough to feel padded.

Completeness3/5

Read and create are covered well, but there is no way to update, delete, or cancel a pin, and no way to list the user's own pins or check payment/plan status after checkout. These are notable gaps for a service that charges for permanent pins, though agents can work around them by sharing URLs and re-searching.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables location-aware AI agents to search for nearby places, get detailed place information including hours and ratings, and calculate routes with turn-by-turn directions using Google Maps APIs.
    22
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI assistants to search, validate, and edit OpenStreetMap data through natural language commands and built-in safety protections. It supports discovery of nearby amenities, geographic data exploration, and secure map editing via OAuth authentication.
    33
    36 PyPI
    4
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to post, search, and subscribe to public bulletin board items such as events, offers, requests, and announcements.
    49 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to find nearby public places such as pharmacies, supermarkets, gas stations, EV chargers, libraries, and post offices, with attributed opening-hours data from OpenStreetMap.
    1
    MIT