← Back to Developer Portal

API Documentation

Everything you need to integrate with the Tampa.dev platform.

MCP Resources

MCP resources provide read-only access to Tampa.dev platform data through a tampadev:// URI scheme. Resources are designed for AI agents that need to load context about the platform -- events, groups, profiles, badges, and more -- without invoking tools.

Resources complement tools: while tools perform actions and return results, resources provide structured data that agents can reference when reasoning about the platform.

URI Scheme

All resources use the tampadev:// URI scheme. Static resources have fixed URIs, while dynamic resources use templates with {parameter} placeholders.

Available Resources

URI PatternDescriptionRequired ScopeMIME Type
tampadev://eventsList of upcoming eventsread:eventsapplication/json
tampadev://events/{id}Details for a specific eventread:eventsapplication/json
tampadev://groupsList of all groupsread:groupsapplication/json
tampadev://groups/{slug}Details for a specific groupread:groupsapplication/json
tampadev://profileThe authenticated user's profileread:userapplication/json
tampadev://badgesList of all available badgesNone (public)application/json
tampadev://leaderboardGlobal XP leaderboardNone (public)application/json
tampadev://leaderboard/{slug}Group-specific leaderboardNone (public)application/json
tampadev://scopesAvailable OAuth scopes and descriptionsNone (public)application/json

Resource Templates

Some resources accept parameters in the URI. These are defined as resource templates in the MCP protocol. When listing resources, the server returns both static resources and templates:

  • Static resources have fixed URIs (e.g., tampadev://events, tampadev://profile).
  • Resource templates have parameters enclosed in braces (e.g., tampadev://events/{id}).

To read a template resource, replace the parameter with the actual value (e.g., tampadev://events/evt_abc123).

Listing Resources

Use resources/list to discover all available resources:

Request:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "resources/list"
}

Response:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "resources": [
      {
        "uri": "tampadev://events",
        "name": "Upcoming Events",
        "description": "List of upcoming community events",
        "mimeType": "application/json"
      },
      {
        "uri": "tampadev://groups",
        "name": "Groups",
        "description": "List of community groups",
        "mimeType": "application/json"
      },
      {
        "uri": "tampadev://profile",
        "name": "User Profile",
        "description": "The authenticated user's profile",
        "mimeType": "application/json"
      },
      {
        "uri": "tampadev://badges",
        "name": "Badges",
        "description": "Available badges across all groups",
        "mimeType": "application/json"
      },
      {
        "uri": "tampadev://leaderboard",
        "name": "Global Leaderboard",
        "description": "Platform-wide XP leaderboard",
        "mimeType": "application/json"
      },
      {
        "uri": "tampadev://scopes",
        "name": "OAuth Scopes",
        "description": "Available OAuth scopes and their descriptions",
        "mimeType": "application/json"
      }
    ],
    "resourceTemplates": [
      {
        "uriTemplate": "tampadev://events/{id}",
        "name": "Event Details",
        "description": "Full details for a specific event",
        "mimeType": "application/json"
      },
      {
        "uriTemplate": "tampadev://groups/{slug}",
        "name": "Group Details",
        "description": "Full details for a specific group by slug",
        "mimeType": "application/json"
      },
      {
        "uriTemplate": "tampadev://leaderboard/{slug}",
        "name": "Group Leaderboard",
        "description": "XP leaderboard for a specific group",
        "mimeType": "application/json"
      }
    ]
  }
}

Reading a Static Resource

Use resources/read with the resource URI to fetch its data:

Request:

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "resources/read",
  "params": {
    "uri": "tampadev://events"
  }
}

Response:

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "contents": [
      {
        "uri": "tampadev://events",
        "mimeType": "application/json",
        "text": "[{\"id\":\"evt_abc123\",\"title\":\"React Meetup\",\"startTime\":\"2026-02-15T18:00:00Z\",\"groupName\":\"Tampa React\",\"rsvpCount\":24},{\"id\":\"evt_def456\",\"title\":\"Rust Workshop\",\"startTime\":\"2026-02-20T14:00:00Z\",\"groupName\":\"Tampa Rust\",\"rsvpCount\":15}]"
      }
    ]
  }
}

Reading a Template Resource

Replace the template parameter with an actual value:

Request:

{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "resources/read",
  "params": {
    "uri": "tampadev://groups/tampadevs"
  }
}

Response:

{
  "jsonrpc": "2.0",
  "id": 3,
  "result": {
    "contents": [
      {
        "uri": "tampadev://groups/tampadevs",
        "mimeType": "application/json",
        "text": "{\"id\":\"grp_tampadevs\",\"name\":\"Tampa Devs\",\"slug\":\"tampadevs\",\"description\":\"Tampa Bay's developer community\",\"memberCount\":1200,\"eventCount\":45,\"featured\":true}"
      }
    ]
  }
}

Reading the User Profile

The tampadev://profile resource returns the authenticated user's profile. This requires the read:user scope:

Request:

{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "resources/read",
  "params": {
    "uri": "tampadev://profile"
  }
}

Response:

{
  "jsonrpc": "2.0",
  "id": 4,
  "result": {
    "contents": [
      {
        "uri": "tampadev://profile",
        "mimeType": "application/json",
        "text": "{\"id\":\"usr_abc123\",\"name\":\"Jane Developer\",\"username\":\"janedev\",\"bio\":\"Building cool stuff in Tampa\",\"location\":\"Tampa, FL\",\"xp\":450,\"level\":5,\"badgeCount\":8}"
      }
    ]
  }
}

Reading OAuth Scopes

The tampadev://scopes resource is publicly accessible and returns the full scope reference. This is useful for agents that need to understand the permission model:

Request:

{
  "jsonrpc": "2.0",
  "id": 5,
  "method": "resources/read",
  "params": {
    "uri": "tampadev://scopes"
  }
}

Response:

{
  "jsonrpc": "2.0",
  "id": 5,
  "result": {
    "contents": [
      {
        "uri": "tampadev://scopes",
        "mimeType": "application/json",
        "text": "{\"scopes\":[{\"key\":\"read:events\",\"description\":\"Read events and event details\"},{\"key\":\"read:groups\",\"description\":\"Read groups and group details\"},{\"key\":\"read:user\",\"description\":\"Read your public profile data\"},{\"key\":\"user\",\"description\":\"Read/write access to profile info\"}],\"hierarchy\":{\"user\":[\"read:user\",\"user:email\"]}}"
      }
    ]
  }
}

Error Handling

If a resource is not found or the caller lacks the required scope, the server returns a JSON-RPC error:

{
  "jsonrpc": "2.0",
  "id": 99,
  "error": {
    "code": -32002,
    "message": "Resource not found: tampadev://events/nonexistent"
  }
}

Resources vs Tools

Use resources when you need to load context for reasoning. Use tools when you need to perform actions.

Use CaseApproach
"What events are coming up?"Read tampadev://events
"Tell me about Tampa Devs"Read tampadev://groups/tampadevs
"RSVP me to the React meetup"Call events_rsvp tool
"What scopes should I request?"Read tampadev://scopes
"Show me the leaderboard for Tampa Rust"Read tampadev://leaderboard/tampa-rust