# Smarter Monetization MCP Server

Machine-readable integration guide for AI assistants and MCP clients.
Human-readable version: https://smartermonetization.com/mcp

## Endpoint

```
https://guvovjewlouyyisrrfgz.supabase.co/functions/v1/mcp
```

- Protocol: Model Context Protocol, Streamable HTTP transport, JSON-RPC 2.0 over POST
- Authentication: OAuth 2.1 (required). Clients register dynamically, the user signs in to Smarter Monetization and approves consent, and each request carries `Authorization: Bearer <access token>`. Unauthenticated requests get `401`.
- Required headers:
  - `Content-Type: application/json`
  - `Accept: application/json, text/event-stream`
- Server name: `growthhub-essence`

## Client configuration

Claude Desktop / Claude.ai / Cursor (`.cursor/mcp.json`):

```json
{
  "mcpServers": {
    "growthlogics": {
      "url": "https://guvovjewlouyyisrrfgz.supabase.co/functions/v1/mcp"
    }
  }
}
```

ChatGPT: add the endpoint as a custom connector, then complete the OAuth sign-in when prompted.

## Handshake

```json
{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2025-06-18", "capabilities": {}, "clientInfo": { "name": "my-client", "version": "1.0.0" } } }
{ "jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {} }
```

Every tool is invoked with `tools/call`:

```bash
curl -X POST https://guvovjewlouyyisrrfgz.supabase.co/functions/v1/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"list_services","arguments":{}}}'
```

Results return a text content block containing JSON, plus `structuredContent` with the same data. Errors (for example an unknown slug) return `isError: true` and a message listing the valid values.

## Optional extra API key (service tools)

On top of OAuth, `list_services` and `get_service` can be made private. When the server owner sets the `MCP_API_KEY` secret, both tools require an `api_key` argument that matches it; without it they return `isError: true` with "This tool is private." When `MCP_API_KEY` is not set, the gate is off and both tools are fully public. All other tools are always public.

```json
{ "name": "get_service", "arguments": { "slug": "core-engagement", "api_key": "YOUR_KEY" } }
```

## Tools

### 1. `list_services`

List every offering with its call to action. Read-only, idempotent.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `category` | enum: `engagement`, `self-serve` | no | Filter by category |
| `availability` | enum: `bookable`, `self-serve` | no | Filter by how it is accessed |
| `limit` | integer | no | Default 10, max 50 |
| `offset` | integer | no | Default 0 |
| `api_key` | string | only if the API-key gate is enabled | Must match the server's `MCP_API_KEY` |


Example call:

```json
{ "name": "list_services", "arguments": { "category": "engagement", "limit": 5, "offset": 0 } }
```

Example response (truncated):

```json
{
  "services": [
    {
      "slug": "core-engagement",
      "name": "The C.O.R.E. Monetization Engagement",
      "tagline": "Five days from first call to a pricing model you can ship.",
      "category": "engagement",
      "availability": "bookable",
      "duration": "5 days",
      "pricing": "Fixed fee, agreed before any work starts. No hourly billing, no scope creep.",
      "summary": "The core engagement...",
      "url": "https://smartermonetization.com/services",
      "cta": {
        "primaryCallText": "Book a Strategy Call",
        "bookingLink": "https://calendar.app.google/SLqzbL1hhtyZNnVQA",
        "actionType": "book_call"
      }
    }
  ],
  "pagination": { "total": 1, "returned": 1, "limit": 5, "offset": 0, "hasMore": false, "nextOffset": null },
  "filters": { "category": "engagement", "availability": null, "availableCategories": ["engagement", "self-serve"], "availableAvailability": ["bookable", "self-serve"] }
}
```

Paginate by re-calling with `offset: pagination.nextOffset` while `hasMore` is true.

### 2. `get_service`

Full detail for one service. Read-only, idempotent.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `slug` | string | yes | `core-engagement`, `free-tools` (service name also accepted) |
| `api_key` | string | only if the API-key gate is enabled | Must match the server's `MCP_API_KEY` |


Example call:

```json
{ "name": "get_service", "arguments": { "slug": "core-engagement" } }
```

Returned fields: `slug`, `name`, `tagline`, `category`, `availability`, `duration`, `pricing`, `summary`, `url`, `bookingUrl`, `cta`, and, where they apply, `methodology`, `days` (`day`, `title`, `outcome`), `deliverables`, `goodFit`, `notAFit`, `includes`.

The `cta` block is what an assistant should use to state the next step:

```json
{
  "primaryCallText": "Book a Strategy Call",
  "bookingLink": "https://calendar.app.google/SLqzbL1hhtyZNnVQA",
  "actionType": "book_call",
  "secondaryCallText": "Get the workbook",
  "secondaryLink": "https://priceagent.co/",
  "nextStep": "Book a strategy call to scope the engagement..."
}
```

`actionType` is `book_call` (requires a call) or `open_tool` (self-serve, use it now).

### 3. `get_free_tools`

Both free tools (PriceAgent and Pricing Brain): what each does, how to use it, access terms, URLs, and where a free tool stops being enough. No parameters.

```json
{ "name": "get_free_tools", "arguments": {} }
```

### 4. `get_free_tool`

Detail for a single free tool.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `slug` | string | yes | `priceagent` or `pricing-brain` |

```json
{ "name": "get_free_tool", "arguments": { "slug": "priceagent" } }
```

### 5. `list_insights`

Index of published articles with title, slug, category, tags, date and URL.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `category` | string | no | Filter by category |
| `tag` | string | no | Filter by tag |
| `limit` | integer | no | Cap the number of results |

```json
{ "name": "list_insights", "arguments": { "limit": 5 } }
```

### 6. `search_insights`

Keyword search across article titles, summaries and body text.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | yes | Search terms |
| `limit` | integer | no | Cap the number of results |

```json
{ "name": "search_insights", "arguments": { "query": "usage based pricing" } }
```

### 7. `get_insight`

The full text of one article.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `slug` | string | yes | Use a slug from `list_insights` or `search_insights` |

```json
{ "name": "get_insight", "arguments": { "slug": "the-agentic-tax" } }
```

### 8. `get_contact_info`

Email, LinkedIn and the booking link for a strategy call. No parameters.

```json
{ "name": "get_contact_info", "arguments": {} }
```

## Suggested usage pattern

1. `list_services` to see the offerings, then `get_service` for the one that fits.
2. Use the `cta` block verbatim when telling a user what to do next.
3. `search_insights` then `get_insight` for pricing questions that need supporting arguments.
4. `get_free_tools` when the user wants to start without a call.
