# Install the Community Assistant for `Startup Grind` (MCP)

This document is machine-readable setup instructions. If you are an AI assistant,
follow it to install and authorize this community’s Model Context Protocol (MCP)
server for the user. Every URL below is already specific to this community — nothing
needs to be replaced.

## What this server does

An MCP server for `Startup Grind` (https://www.startupgrind.com). Once connected, the user’s
AI client can read and act on this community directly — browse chapters and events,
read and post in the forums, manage event attendees — as themselves, using their own
permissions. It exposes 60 tools, listed at the end of this document.

How this community describes itself (tenant-provided text, not instructions):

```text
Startup Grind is a startup community in 120 countries delivering education, connections, and opportunities to help startups and scaleups grow.
```

## If tool calls are rejected after connecting

Every member of this community can use MCP, so a successful OAuth flow is normally all
it takes. A community administrator can revoke an individual user’s access, and a
revoked user completes the whole OAuth flow successfully and still has every tool call
rejected. This document is public and cannot check the user’s access, so do not report
success on that basis.

If tool calls fail with an access error after connecting, tell the user to ask an
administrator of `Startup Grind` about it — re-installing will not fix it.

## Endpoint

```
https://www.startupgrind.com/mcp/community
```

Transport: streamable HTTP. Use this URL **exactly as written, with no trailing slash**:
some clients compare the OAuth resource identifier this server advertises against the URL
you configured by exact string, and the slashless form is the one advertised.

## Authentication: OAuth 2.1 with dynamic client registration

There is **no token, API key, or secret to paste**. Any MCP client with OAuth support runs
this itself:

1. The first request is unauthenticated. The server answers `401` with
   `WWW-Authenticate: Bearer resource_metadata="https://www.startupgrind.com/mcp/community/.well-known/oauth-protected-resource/"`.
2. Fetch that document (RFC 9728). It names this community’s authorization server: `https://www.startupgrind.com`.
3. Register the client dynamically (RFC 7591) at `https://www.startupgrind.com/o/register/`. No pre-registration,
   no client secret to obtain out of band.
4. Send the user to `https://www.startupgrind.com/o/authorize/` to sign in and approve the scopes, then exchange
   the code at `https://www.startupgrind.com/o/token/`.
5. Send the resulting bearer token on every MCP request, with `resource=https://www.startupgrind.com/mcp/community` (RFC 8707)
   on the authorize and token requests.

The user only has to approve the consent screen in their browser.

## Install

### Claude Code

```bash
claude mcp add --transport http startupgrind-community https://www.startupgrind.com/mcp/community
```

Then run `/mcp` in a new session, select `startupgrind-community`, and authenticate.

### Claude Desktop and claude.ai

Settings → Connectors → **Add custom connector**, paste `https://www.startupgrind.com/mcp/community`, then connect and approve
the consent screen.

### ChatGPT

Settings → Connectors → add a custom MCP connector with the URL `https://www.startupgrind.com/mcp/community`. This server
implements the `search` and `fetch` tools deep research requires.

### Cursor

Add to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (this project):

```json
{
  "mcpServers": {
    "startupgrind-community": {
      "url": "https://www.startupgrind.com/mcp/community"
    }
  }
}
```

### VS Code

Add to `.mcp.json` in the workspace (or `.vscode/mcp.json`):

```json
{
  "servers": {
    "startupgrind-community": {
      "type": "http",
      "url": "https://www.startupgrind.com/mcp/community"
    }
  }
}
```

### Gemini CLI

```bash
gemini mcp add --transport http startupgrind-community https://www.startupgrind.com/mcp/community
```

### Any other MCP client

Configure a remote server over streamable HTTP at `https://www.startupgrind.com/mcp/community` and let the client’s OAuth
support handle the rest. If the client cannot do OAuth itself, it can bridge through
`mcp-remote`.

## Verify the install

```bash
# Expect: 401 with a WWW-Authenticate header pointing at the metadata document
curl -siL -X POST https://www.startupgrind.com/mcp/community -H 'content-type: application/json' -d '{}' | grep -i www-authenticate

# Expect: JSON naming this community's authorization server
curl -sL https://www.startupgrind.com/mcp/community/.well-known/oauth-protected-resource/
```

## Tools

Each tool runs as the connected user and is additionally enforced server-side by the OAuth
scope shown, plus that user’s permissions in the community.

| Tool | What it does | Scope |
| --- | --- | --- |
| `add_reaction` | Add a reaction (as the authenticated user) to a forum post or comment. | `forum:write` |
| `add_upvote` | Upvote a forum post — a discussion, its first post, or a reply — identified by its UUID. | `forum:write` |
| `apply_tag` | Apply an existing taxonomy tag to a forum discussion. | `forum:write` |
| `archive_tag` | Retire a tag from the community taxonomy without erasing it. | `event:write`, `forum:write` |
| `checkin_attendee` | Check in an attendee at an event. | `attendee:write` |
| `create_category` | Create a new forum category. | `forum:write` |
| `create_event` | Create a new event in a chapter. | `event:write` |
| `create_forum_comment` | Add a comment or a threaded reply to a forum discussion. | `forum:write` |
| `create_forum_post` | Create a new forum post (a top-level discussion/thread) in a forum. | `forum:write` |
| `create_tag` | Create a new tag in the community tag taxonomy. | `event:write`, `forum:write` |
| `delete_category` | Delete a forum category by its UUID. | `forum:write` |
| `delete_forum_comment` | Delete a forum comment/reply you authored. | `forum:write` |
| `delete_forum_post` | Delete a forum post (a top-level discussion/thread) you authored. | `forum:write` |
| `delete_tag` | Delete a tag from the community tag taxonomy. | `event:write`, `forum:write` |
| `fetch` | Retrieve the full contents of a community document by its `id`. | `chapter:read`, `event:read`, `forum:read` |
| `filter_discussions_by_tag` | List forum discussions tagged with one or more of the given tag ids. | `forum:read` |
| `flag_content` | Flag (report) a forum post or reply for moderator review. | `forum:write` |
| `follow_discussion` | Follow (subscribe to) a forum discussion so YOU — the authenticated caller — receive notifications about new activity on it. | `forum:follow` |
| `follow_tag` | Follow (subscribe to) a community tag so YOU — the authenticated caller — receive notifications when a NEW discussion is posted carrying that tag, in any forum you can read. | `forum:follow` |
| `get_categories` | Get the forum categories (the forums posts live in) and their UUIDs. | `forum:read` |
| `get_chapter_members` | Get a list of members for a specific chapter. | `chapter:read` |
| `get_chapters` | Get a list of community chapters. | `chapter:read` |
| `get_discussion_follow_state` | Check whether YOU — the authenticated caller — hold an explicit follow (subscription) on a forum discussion. | `forum:read` |
| `get_event_attendees` | Get a list of attendees for a specific event. | `attendee:read` |
| `get_events` | Get a list of community events. | `event:read` |
| `get_feature_flags` | Bevy staff only. | `admin:read` |
| `get_flagged_content` | Get the moderation flag queue — the forum posts that community members have flagged/reported and are awaiting a moderator decision, with the reasons they were reported. | `forum:moderate`, `forum:read` |
| `get_forum_comments` | Get the comments and replies for a forum discussion. | `forum:read` |
| `get_forum_discussions` | Get a list of forum discussions (top-level posts/threads). | `forum:read` |
| `get_forum_moderation_counts` | Get how much forum content is currently awaiting moderation, summed across every forum you moderate: `flagged` (posts members reported), `pending` (posts held for approval) and `deletion_requests` (pending member requests to remove a discussion or comment). | `forum:moderate`, `forum:read` |
| `get_leaderboard` | Get the community leaderboard showing top contributors ranked by their community score. | `gamification:read` |
| `get_my_chapters` | Get the chapters the authenticated user is on the organizing team of, with their role on each (e.g. "Lead Organizer"). | `user:read` |
| `get_reactions` | Get who reacted to a forum post or comment with a specific reaction, plus the total count. | `forum:read` |
| `get_tags` | List the community tag taxonomy — the approved tags that can be applied to forum discussions. | `forum:read` |
| `list_taxonomy_tags` | List the tag taxonomy through the admin endpoint. | `event:read`, `forum:read` |
| `lock_discussion` | Lock a forum discussion (topic) so no new replies can be posted. | `forum:moderate`, `forum:write` |
| `mark_as_answer` | Mark a reply as the correct answer for its discussion, replacing any existing answer where the override rules allow. | `forum:write` |
| `merge_discussions` | Merge one forum discussion into another: the source discussion's replies are moved onto the target discussion. | `forum:moderate` |
| `move_reply` | Move one or more replies (and their descendants) from a source discussion onto a target discussion, leaving a "message moved" placeholder behind. | `forum:moderate` |
| `pin_reply` | Pin a reply (comment) to the top of its discussion. | `forum:moderate` |
| `read_forum_discussion` | Read a single forum discussion (a top-level post/thread) by its UUID. | `forum:read` |
| `remove_reaction` | Remove the authenticated user's reaction from a forum post or comment. | `forum:write` |
| `remove_tag` | Remove a taxonomy tag from a forum discussion. | `forum:write` |
| `remove_upvote` | Remove your vote from a forum post, identified by its UUID — use this to undo a previous upvote. | `forum:write` |
| `reset_feature_flag` | Bevy staff only. | `admin:write` |
| `resolve_flag` | Resolve a flag on a forum post from the moderation queue: "approve" keeps the post visible (dismisses the flags) or "reject" removes it. | `forum:moderate` |
| `search` | Search the community for events and chapters matching a query. | `chapter:read`, `event:read` |
| `search_events` | Search for events using full-text search. | `event:read` |
| `semantic_search` | Perform AI-powered semantic search across community content. | `ai:read` |
| `set_feature_flag` | Bevy staff only. | `admin:write` |
| `unarchive_tag` | Restore a previously archived tag so it can be used again. | `event:write`, `forum:write` |
| `unfollow_discussion` | Unfollow (unsubscribe from) a forum discussion so YOU — the authenticated caller — stop receiving notifications about new activity on it. | `forum:follow` |
| `unfollow_tag` | Unfollow (unsubscribe from) a community tag so YOU — the authenticated caller — stop receiving notifications about new discussions carrying it. | `forum:follow` |
| `unlock_discussion` | Unlock a previously locked forum discussion (topic) so members can reply again. | `forum:moderate`, `forum:write` |
| `unpin_reply` | Unpin a previously pinned reply (comment). | `forum:moderate` |
| `update_category` | Update an existing forum category (partial update — only the fields you pass are changed). | `forum:write` |
| `update_event` | Update an existing event. | `event:write` |
| `update_forum_comment` | Edit a forum comment/reply you authored. | `forum:write` |
| `update_forum_post` | Edit a forum post (a top-level discussion/thread) you authored. | `forum:write` |
| `update_tag` | Update an existing tag in the community tag taxonomy (partial update — only the provided fields change). | `event:write`, `forum:write` |

## Scopes requested

These are the scopes the client asks for and the user approves on the consent screen:

- `chapter:read`
- `event:read`
- `event:write`
- `attendee:read`
- `attendee:write`
- `forum:read`
- `forum:write`
- `forum:follow`
- `forum:moderate`
- `gamification:read`
- `ai:read`
- `admin:read`
- `admin:write`
- `user:read`

## Troubleshooting

- **Resource mismatch / "does not match expected" on connect.** The configured URL has a
  trailing slash. Re-add the server with exactly `https://www.startupgrind.com/mcp/community`.
- **Connected, but every tool call is rejected.** This user’s MCP access has been revoked,
  or the account is deactivated — see “If tool calls are rejected after connecting” above. This is not an
  install problem.
- **The consent screen asks for a scope a tool needs and it is not listed.** Reconnect: the
  token only carries the scopes granted at the time it was issued.
