Ticket Fighter

Ticket Fighter

Automates parking ticket detection, evidence gathering, and dispute preparation across multiple US cities.

Category
访问服务器

README

Ticket Fighter

An MCP server that automates parking ticket detection, evidence gathering, and dispute preparation across multiple US cities. Runs fully in the cloud via the @ticket_fighter MMP bot or locally as a stdio MCP server.

MMP Bot

DM @ticket_fighter on MMP to use Ticket Fighter through any AI assistant. The bot runs on Railway and handles everything headlessly.

Landing page: tf.mmp.chat

Commands:

  • add ABC1234 NY nyc — Monitor a plate
  • check — Scan for tickets now
  • analyze 1234567 nyc — Evidence & defense strategy
  • dispute 1234567 nyc — Generate dispute
  • submit 1234567 nyc — Submit to city portal
  • status 1234567 nyc — Check outcome
  • gmail — Connect Gmail for decision tracking
  • help — Show all commands

Bot source: /ticket-fighter-bot

Supported Cities (24)

Open Data API (no browser needed)

City API Fallback
NYC NYC Open Data (SODA nc67-uf89) CityPay scraper if data >30 days stale
San Francisco SF Open Data (SODA ab4h-6ztd) eTIMS scraper if data >30 days stale
Chicago CHIPAY JSON API (ticket # lookups) Browser scraper for plate searches (hCaptcha)

No CAPTCHA (fully automatable)

City Platform Dispute Method
Boston RMC Pay Online/mail/video appeal
Miami RMC Pay Via Miami Parking Authority
Charlotte RMC Pay 3-tier appeal
Denver RMC Pay Via portal
Dallas RMC Pay Via portal
Raleigh RMC Pay Via portal
Orlando CPC Notarized appeal form (PDF)
Baltimore Custom Phone/in-person (410-396-3000)
Atlanta DS Payments Duncan appeal portal (14-day deadline)
San Diego DS Payments Duncan appeal portal
Detroit DS Payments Duncan appeal portal
Pittsburgh DS Payments Duncan appeal portal
Milwaukee DS Payments Duncan appeal portal
Sacramento DS Payments Duncan appeal portal
New Orleans DS Payments Duncan appeal portal

CAPTCHA (auto-solved via 2Captcha, or user solves in browser)

City Platform CAPTCHA Type Dispute Method
NYC CityPay reCAPTCHA v2 HBW online hearing
Chicago CHIPAY hCaptcha eHearing
Washington DC eTIMS Custom image DC DMV online
San Francisco eTIMS Custom image SFMTA citations
Detroit (eTIMS) eTIMS Custom image Via portal
Cleveland eTIMS Custom image Via portal
Columbus eTIMS Custom image Via portal
Oakland eTIMS Custom image Via portal
Santa Monica eTIMS Custom image Via portal

Platform adapters (add new cities with one line of config)

  • RMC Pay — 50+ US cities use this platform. Add any with: createRmcPayAdapter({ cityId, displayName, subdomain })
  • DS Payments — 25+ cities. Add with: createDsPaymentsAdapter({ cityId, displayName, citySlug, appealSlug })
  • eTIMS — 10+ major cities. Add with: createEtimsAdapter({ cityId, displayName, cityPath, subdomain })

Cloud Operation

Ticket Fighter runs fully headless in the cloud with these env vars:

Var Purpose
CAPTCHA_API_KEY 2Captcha API key — auto-solves reCAPTCHA v2 (NYC) and hCaptcha (Chicago)
GOOGLE_CLIENT_ID Google OAuth client ID — enables Gmail API for decision tracking
GOOGLE_CLIENT_SECRET Google OAuth client secret
GOOGLE_REDIRECT_URI OAuth callback URL (e.g. https://tf.mmp.chat/auth/gmail/callback)

Without these, the tools fall back to headed browser mode (local use only).

ChatGPT App

Ticket Fighter includes a widget UI for ChatGPT. All tools render inline results — a dashboard for check_tickets, detail views for analyze_ticket, dispute previews, and status badges.

To rebuild the widget: cd app && npm install && npm run build

Setup

npm install
npx playwright install chromium
cd app && npm install && npm run build && cd ..
npm run build

Claude Code (.mcp.json)

{
  "mcpServers": {
    "ticket-fighter": {
      "command": "node",
      "args": ["/path/to/ticket-fighter/dist/index.js"]
    }
  }
}

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "ticket-fighter": {
      "command": "node",
      "args": ["/path/to/ticket-fighter/dist/index.js"]
    }
  }
}

Tools

manage_plates

Add, remove, or list saved license plates.

check_tickets

Scan city portals for open violations on your saved plates.

analyze_ticket

Gather evidence for a specific ticket: details, Street View imagery, registration cross-references, applicable traffic rules, common defenses, and past dispute history.

generate_dispute

Format dispute arguments into city-specific structure. Returns a preview — does not submit.

submit_dispute

Submit a previewed dispute. Requires explicit confirmation.

check_status

Check dispute status via city portal or Gmail search for decision emails.

setup_gmail

Connect Gmail for decision email monitoring. With Google OAuth configured, returns an authorization URL. Without it, opens a browser for manual login.

Scripts (NYC submission helpers)

NYC's submit_dispute MCP tool intentionally throws — DOF submissions require the user in the loop (evidence upload, personal info, penalty-of-perjury attestation). Two scripts in scripts/ handle the flow:

fetch-summons-citypay.mjs <violation>...

Launches a headed Chromium, walks through CityPay's "Search by Parking Violation" tab for each violation, saves the officer's summons image and CityPay results page to ~/.ticket-fighter/decisions/. User solves any reCAPTCHA; script auto-detects solve (token present OR form navigation) and continues.

node scripts/fetch-summons-citypay.mjs 9270466449 4051701815 8998315609

submit-dispute-nyc.mjs <violation>

Polling-fill for NYC DOF's "Dispute by Web" form. Opens https://www.nyc.gov/site/finance/vehicles/dispute-web.page; user clicks "Dispute by Web" (opens a new tab); script watches all tabs and iframes in the context; every 3 seconds it fills any form field it recognizes (name, address, city, zip, email, plate, violation #, argument textarea) and attaches evidence files to any input[type=file]. Stops at the final Review/Submit page — user reviews and clicks submit manually.

Configure at the top of the script:

  • RESPONDENT — name, address, email
  • EVIDENCE — map of violation # → array of file paths
  • Dispute argument text is loaded from ~/.ticket-fighter/decisions/dispute-<violation>.txt
node scripts/submit-dispute-nyc.mjs 9270466449

DOF-accepted file types: PDF, JPG/JPEG, TIFF, BMP, GIF. Not PNG — convert with sips -s format jpeg in.png --out out.jpg before listing in EVIDENCE.

Adding a New City

If the city uses RMC Pay (check if {cityname}.rmcpay.com loads their portal):

  1. Add one line to src/adapters/rmcpay-cities.ts: export const myAdapter = createRmcPayAdapter({ cityId: "mycity", displayName: "My City", subdomain: "mycitysubdomain" });
  2. Register in src/index.ts
  3. Build and test

For other platforms:

  1. Create src/adapters/yourcity.ts implementing the CityAdapter interface
  2. Create src/codes/yourcity-codes.json with violation codes and defenses
  3. Register the adapter in src/index.ts
  4. Build and test

License

MIT

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选