Skip to content

subtrack implements an MCP (Model Context Protocol) server that allows AI assistants — such as Claude Desktop, Cursor, and Windsurf — to read and manage your subscriptions directly.

Starting the server

bash
subtrack mcp

The server runs on stdio (StdioServerTransport). It prints JSON-RPC messages over stdout and reads from stdin. This is the standard transport used by all MCP hosts.

Integration examples

Claude Desktop

Add to your claude_desktop_config.json:

json
{
  "mcpServers": {
    "subtrack": {
      "command": "subtrack",
      "args": ["mcp"]
    }
  }
}

Cursor

In Cursor settings, add an MCP server:

Name: subtrack
Type: command
Command: subtrack mcp

Windsurf

In Windsurf settings, add an MCP server pointing to the same command.

Available tools

The MCP server exposes 20 tools covering subscription management, analytics, tagging, and LLM API usage tracking.

Subscription CRUD

ToolDescription
list_subscriptionsList all subscriptions with optional sort and paging
get_subscriptionGet a single subscription by ID
add_subscriptionAdd a new subscription
edit_subscriptionEdit an existing subscription
delete_subscriptionDelete a subscription by ID
search_subscriptionsSearch by name, notes, or tags

Analytics & Reports

ToolDescription
get_summarySubscription summary statistics
get_analyticsAnalytics: summary plus per-status breakdown
get_upcomingUpcoming bills within N days
get_calendarCalendar entries for a month
get_forecastSpending forecast with what-if scenarios
compareCompare current vs previous period spending
get_historyPrice change history

Tags

ToolDescription
list_tagsList all tags with subscription counts
get_tag_subscriptionsSubscriptions matching one or more tags (AND logic)

LLM API Usage

ToolDescription
get_usage_totalAggregated usage: cost, tokens, provider/model breakdown
list_usageList usage entries with provider/date filters

Data Management

ToolDescription
export_dataExport as CSV, JSON, or Markdown
bulk_operationsBulk status change, delete, or tag operations
get_trialsTrial periods with optional expiring-soon filter

Tool schemas

Each tool accepts a JSON object with the following parameters:

list_subscriptions

  • sort (string, optional): Sort field — name, price, currency, cycle, status
  • desc (boolean, optional): Sort descending
  • limit (number, optional): Max entries to return
  • offset (number, optional): Skip the first N entries (for paging)

get_subscription

  • id (number, required): Subscription ID

add_subscription

  • name (string, required): Subscription name
  • price (number, required): Price in smallest currency unit
  • currency (string, required): Currency code (e.g. USD, JPY)
  • cycle (string, required): Billing cycle — weekly, bi-weekly, monthly, quarterly, semi-annual, yearly
  • tags (string, optional): Comma-separated tags
  • billingDay (number, optional): Billing day of month (1–31)
  • status (string, optional): active, paused, cancelled
  • paymentMethod (string, optional): Payment method
  • notes (string, optional): Notes

edit_subscription

  • id (number, required): Subscription ID
  • All other fields same as add_subscription (all optional except id)

delete_subscription

  • id (number, required): Subscription ID

search_subscriptions

  • query (string, required): Search query
  • names (boolean, optional): Search in names
  • notes (boolean, optional): Search in notes
  • tags (boolean, optional): Search in tags

get_upcoming

  • days (number, optional): Number of days (default: 7)

get_calendar

  • month (number, optional): Month (1–12)
  • year (number, optional): Year

get_forecast

  • months (number, optional): Number of months (default: 12)
  • currency (string, optional): Convert to target currency
  • cancel (string, optional): Comma-separated names to exclude

compare

  • period (string, optional): monthly, quarterly, yearly
  • currency (string, optional): Convert to target currency

export_data

  • format (string, required): csv, json, or md

bulk_operations

  • action (string, required): status, delete, tag_add, tag_remove
  • status (string, optional): Target status for status action
  • tag_name (string, optional): Tag name for tag actions
  • filter_tag (string, optional): Filter by tag
  • filter_status (string, optional): Filter by status
  • filter_name (string, optional): Filter by name pattern

get_history

  • id (number, optional): Filter by subscription ID
  • days (number, optional): Recent days to include

get_trials

  • expiring_soon (number, optional): Filter trials expiring within N days

list_tags

  • No parameters

get_tag_subscriptions

  • tag (string, required): Comma-separated tag names (all must match)

get_usage_total

  • from (string, optional): Start date YYYY-MM-DD (default: current month)
  • to (string, optional): End date YYYY-MM-DD (default: current month)
  • Returns total (cost in USD cents), tokens, byProvider, and byModel

list_usage

  • provider (string, optional): Filter by provider
  • from (string, optional): Start date YYYY-MM-DD
  • to (string, optional): End date YYYY-MM-DD
  • limit (number, optional): Max entries (default: 100)

Validation

add_subscription and edit_subscription validate currency (supported ISO 4217 codes), cycle (weekly, bi-weekly, monthly, quarterly, semi-annual, yearly), and status (active, paused, cancelled, archived). Invalid values are rejected with an error. bulk_operations validates the target status the same way and reports per-entry errors instead of silently skipping them.

Example usage

Ask your AI assistant:

"Add a Netflix subscription for ¥1,980/month, tagged as video and entertainment."

"Show me my total monthly spending in JPY."

"What subscriptions are due in the next 7 days?"

"Find subscriptions with the tag 'music'."

The assistant will use the MCP tools to read and modify your subtrack database.

MIT