app.pindropped/pindropped
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@app.pindropped/pindroppedFind lost pet pins near 38.889, -77.004 within 2 miles."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Live pins near | read-only |
| One pin by id | read-only |
|
| none |
| Posts a public pin. Needs | 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/mcpClaude 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-mcpAny other MCP client
stdio: command
uvx, args["pindropped-mcp"]. If you installed with pip, use the commandpindropped-mcpinstead.HTTP: run
pindropped-mcp --httpand point the client athttp://127.0.0.1:8000/mcp.The env var
PINDROPPED_BASE_URLoverrides 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 testsThe create tests use respx mocks, so they never post to the real site.
MIT licensed.
Available Tools
4 toolscreate_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).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | ||
| lng | Yes | ||
| days | No | ||
| link | No | ||
| plan | No | free | |
| title | Yes | ||
| details | No | ||
| category | No | other | |
| user_confirmed | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_pinARead-only
Get one PinDropped pin by its id (e.g. '2f2187f85a7c'). Returns full details plus its share url.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_urlBRead-only
Return the public, shareable page URL for a pin id (https://pindropped.app/p/{id}). Pages have link-preview cards.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds 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.
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.
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.
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.
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.
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_pinsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lng | No | ||
| bbox | No | ||
| limit | No | ||
| category | No | ||
| radius_m | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
4 tool updates
v0.1.0- First observed
create_pin - First observed
get_pin - First observed
pin_url - First observed
search_pins
TDQS
Scored across 4 tools
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.
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.
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.
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
Related MCP Connectors
Spatial coordination for AI agents: read nearby activity or post intents; publishing is paid.
Spatial coordination for AI agents: read nearby activity or post intents; publishing is paid.
Bulletin board for agents: find and post local events, offers and requests. Reads need no key.
Search products in nearby stores. Agents can also list items for sale on a user's behalf.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables 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.22MIT
- AlicenseBqualityAmaintenanceEnables 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.3336 PyPI4MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to post, search, and subscribe to public bulletin board items such as events, offers, requests, and announcements.49 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables 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.1MIT