_ registry / mcp http-sse · checked 2h ago

flux

https://www.fluxgraph.app

Registry code: 42045790a26f9899

api record

LinkedIn intelligence: post analytics and research for public profiles and company pages.

from a public catalogue that lists it, not from the operator

endpoint
https://www.fluxgraph.app/mcp
protocol
http-sse ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is flux live?
Yes — it answered the hub's last check (checked 2h ago). It answered 100% of checks over the last 30 days.
Is flux free to use?
Not anonymously — it asks for a key or a login before it will serve. Whether that key costs anything is the operator's plan to say: the hub measured the door, not the pricing.
What tools does flux have?
66 tools: list_profiles, get_usage_history, linkedin_post_comments, get_credit_balance, linkedin_ad_search, list_segments, remove_from_segment, list_segment_templates, ….
Is flux safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
233ms

last good check

priced tools
0

of 66 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 66 tools
66 auth-required 66 of 66 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • list_profiles auth-required never probed

    List all tracked LinkedIn profiles for the authenticated user. Returns profile IDs needed by other tools.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {}
    }
    arguments 5 lines
  • get_usage_history auth-required never probed

    Return recent credit_ledger transactions for the authenticated user. Filter by tool name, reason, or date range. Paginated. Free.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "limit": {
          "type": "number",
          "default": 50,
          "maximum": 200,
          "minimum": 1,
          "description": "Max rows to return"
        },
        "reason": {
          "enum": [
            "monthly_grant",
            "pack_purchase",
            "tool_usage",
            "refund",
            "adjustment"
          ],
          "type": "string",
          "description": "Filter by ledger reason"
        },
        "date_to": {
          "type": "string",
          "description": "End date (ISO 8601)"
        },
        "date_from": {
          "type": "string",
          "description": "Start date (ISO 8601)"
        },
        "tool_name": {
          "type": "string",
          "description": "Filter to a specific MCP tool"
        }
      },
      "additionalProperties": false
    }
    arguments 37 lines
  • linkedin_post_comments auth-required never probed

    Fetch the people who commented on a single LinkedIn post (and their comment text). Costs 5 credits per call. Each comment is persisted to post_engagements with the commenter and full comment text.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "post_url"
      ],
      "properties": {
        "refresh": {
          "type": "boolean",
          "description": "Bypass the cache and re-fetch from LinkedIn (costs 5 credits). Default false: a previously-fetched result is returned free, with how long ago it was retrieved."
        },
        "post_url": {
          "type": "string",
          "description": "Public LinkedIn post URL (e.g. https://www.linkedin.com/feed/update/urn:li:activity:1234)"
        }
      },
      "additionalProperties": false
    }
    arguments 18 lines
  • get_credit_balance auth-required never probed

    Return the authenticated user's current credit balance, this period's monthly allocation, and credits used since the period started. Free.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {}
    }
    arguments 5 lines
  • linkedin_ad_search auth-required never probed

    Search the LinkedIn ad library. Useful for tracking competitor ad creative and messaging. Costs 10 credits per call.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "company": {
          "type": "string",
          "description": "Company name or LinkedIn slug to filter ads"
        },
        "refresh": {
          "type": "boolean",
          "description": "Bypass the cache and re-run the search live (costs 10 credits). Default false: a previously-fetched result is returned free, with how long ago it was retrieved."
        },
        "keywords": {
          "type": "string",
          "description": "Keyword filter applied to ad creative"
        }
      },
      "additionalProperties": false
    }
    arguments 19 lines
  • list_segments auth-required never probed

    List all audience segments for the authenticated user, with member counts. Audience segments are named groups of people (e.g. 'ICP — VPs of Marketing', 'Champions'). Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "type": {
          "enum": [
            "manual",
            "smart",
            "auto_stream"
          ],
          "type": "string",
          "description": "Optional filter by segment type ('manual', 'smart', or 'auto_stream')"
        }
      },
      "additionalProperties": false
    }
    arguments 16 lines
  • remove_from_segment auth-required never probed

    Remove one or more people (by person_id) from an audience segment. Missing members are silently ignored. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "segment_id",
        "person_ids"
      ],
      "properties": {
        "person_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uuid"
          },
          "maxItems": 1000,
          "minItems": 1,
          "description": "person_ids to remove (1-1000 per call)"
        },
        "segment_id": {
          "type": "string",
          "format": "uuid",
          "description": "Target segment id from list_segments"
        }
      },
      "additionalProperties": false
    }
    arguments 26 lines
  • list_segment_templates auth-required never probed

    List available smart-segment templates. Pass a template id to create_segment to pre-fill its `config` predicate without crafting one from scratch. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {}
    }
    arguments 5 lines
  • create_campaign auth-required never probed

    Create a Constellation outreach campaign. A campaign groups target accounts, the people you care about at those accounts, and the warm connections you could approach to reach them. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "description": "User-facing campaign name"
        },
        "description": {
          "type": "string",
          "maxLength": 2000,
          "description": "Optional longer description"
        }
      },
      "additionalProperties": false
    }
    arguments 21 lines
  • get_campaign_stats auth-required never probed

    Summary stats for a Constellation campaign: target count, entry count, outreach volume, and acceptance / reply rates broken down by pool (coworker / engager / mutual) and composite-score tier. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "campaign_id"
      ],
      "properties": {
        "campaign_id": {
          "type": "string",
          "format": "uuid",
          "description": "Campaign id"
        }
      },
      "additionalProperties": false
    }
    arguments 15 lines
  • get_engager_position_history auth-required never probed

    Return a person's full employment timeline from the position graph. Person must have engaged on at least one of your collected posts (engagement gate). Sorted current-first, then most-recent past by started_at desc. Pure DB read — no LinkedIn pull, no credits charged.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "person_id": {
          "type": "string",
          "format": "uuid",
          "description": "people.id UUID"
        },
        "linkedin_url": {
          "type": "string",
          "description": "Person's LinkedIn profile URL"
        }
      },
      "additionalProperties": false
    }
    arguments 16 lines
  • get_alerts auth-required 2h ago

    Return recent alerts for the authenticated user's streams. An alert is emitted whenever a scheduled stream run surfaces new items. Pass `unread_only=true` to skip alerts the user has already marked read. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 200,
          "minimum": 1,
          "description": "Max alerts to return (default 50)"
        },
        "unread_only": {
          "type": "boolean",
          "default": true,
          "description": "Return only alerts that have not been marked read"
        }
      },
      "additionalProperties": false
    }
    arguments 19 lines
  • get_alumni_engagers auth-required 2h ago

    Given a company URL or id, return engagers (across your collected posts) who have a position at that company. Relation filter: 'coworker' = current employees, 'alumni' = any past or current position (most useful for page_type='SCHOOL' companies), 'any' = both. Pure DB read — no LinkedIn pull, no credits charged.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 20,
          "maximum": 100,
          "minimum": 1,
          "description": "Max engagers to return (1-100, default 20)"
        },
        "relation": {
          "enum": [
            "coworker",
            "alumni",
            "any"
          ],
          "type": "string",
          "default": "any",
          "description": "coworker = current employees only; alumni = any position (past or current); any = both"
        },
        "company_id": {
          "type": "string",
          "format": "uuid",
          "description": "companies.id UUID"
        },
        "company_url": {
          "type": "string",
          "description": "Public LinkedIn company URL"
        }
      },
      "additionalProperties": false
    }
    arguments 33 lines
  • get_company_engagement_overlap auth-required 2h ago

    Given two companies, return engagers across your collected posts who engaged with BOTH companies' posts. Cross-account intelligence — finds people interested in multiple targets simultaneously. Pure DB read — no LinkedIn pull, no credits charged.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 20,
          "maximum": 100,
          "minimum": 1,
          "description": "Max overlapping engagers to return (1-100, default 20)"
        },
        "company_a_id": {
          "type": "string",
          "format": "uuid",
          "description": "Company A — companies.id UUID"
        },
        "company_b_id": {
          "type": "string",
          "format": "uuid",
          "description": "Company B — companies.id UUID"
        },
        "company_a_url": {
          "type": "string",
          "description": "Company A — LinkedIn URL"
        },
        "company_b_url": {
          "type": "string",
          "description": "Company B — LinkedIn URL"
        }
      },
      "additionalProperties": false
    }
    arguments 32 lines
  • preview_profile auth-required never probed

    Analyze a public LinkedIn profile or company page without a Flux account: pulls the latest ~50 posts (once per profile) and returns a preview id, post count and a one-line posting summary. Use preview_posting_insights with the preview_id for the full breakdown, and claim_preview after the person signs in to make it their own dashboard.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "linkedin_url"
      ],
      "properties": {
        "linkedin_url": {
          "type": "string",
          "description": "Public LinkedIn profile or company URL, e.g. https://www.linkedin.com/in/janedoe"
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • preview_posting_insights auth-required never probed

    Best day, hour, format and length for a previewed profile (from preview_profile). No account needed.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "preview_id"
      ],
      "properties": {
        "preview_id": {
          "type": "string",
          "description": "preview_id returned by preview_profile"
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • claim_preview auth-required never probed

    Make a profile from preview_profile your own Flux dashboard. Requires sign-in; creates your own_profile stream on the free plan pointing at the same posts. Refuses if you already track that profile.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "preview_id"
      ],
      "properties": {
        "preview_id": {
          "type": "string",
          "description": "preview_id returned by preview_profile"
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • get_posts auth-required never probed

    List a tracked profile's persisted posts with full metrics and text — query against the local post library, no LinkedIn pull, free. Use this when the caller already has a profile_id and wants to read its posts. Filter by date range, post type, minimum engagement, or text. Pass `scope` (a post_collections.id) to restrict to a specific collection (e.g. an external profile, topic stream, or hand-curated set). Paginated. For keyword/semantic search across posts, use `search_posts`. For fresh LinkedIn pulls, use `linkedin_profile_posts`.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "profile_id"
      ],
      "properties": {
        "page": {
          "type": "number",
          "default": 1,
          "description": "Page number (1-based)"
        },
        "scope": {
          "type": "string",
          "description": "Optional post_collections.id to filter posts to a specific collection"
        },
        "search": {
          "type": "string",
          "description": "Text search across post content (case-insensitive)"
        },
        "date_to": {
          "type": "string",
          "description": "End date (ISO 8601)"
        },
        "sort_by": {
          "enum": [
            "total_engagement",
            "likes",
            "comments",
            "shares",
            "published_at",
            "character_count"
          ],
          "type": "string",
          "default": "published_at",
          "description": "Sort field"
        },
        "sort_dir": {
          "enum": [
            "asc",
            "desc"
          ],
          "type": "string",
          "default": "desc",
          "description": "Sort direction"
        },
        "date_from": {
          "type": "string",
          "description": "Start date (ISO 8601, e.g. 2025-01-01)"
        },
        "page_size": {
          "type": "number",
          "default": 25,
          "maximum": 50,
          "minimum": 1,
          "description": "Results per page (max 50)"
        },
        "post_type": {
          "enum": [
            "text",
            "image",
            "video",
            "document",
            "article",
            "poll"
          ],
          "type": "string",
          "description": "Filter by post type"
        },
        "profile_id": {
          "type": "string",
          "description": "Tracked profile ID from list_profiles"
        },
        "min_engagement": {
          "type": "number",
          "description": "Minimum total engagement"
        }
      },
      "additionalProperties": false
    }
    arguments 80 lines
  • get_profile_summary auth-required never probed

    Get KPI summary for a tracked profile: total posts, average engagement (broken down by likes/comments/shares/conversation rate), posts per week, engagement trend, top format, and posting goal status.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "profile_id"
      ],
      "properties": {
        "profile_id": {
          "type": "string",
          "description": "Tracked profile ID from list_profiles"
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • get_posting_insights auth-required never probed

    Get optimal posting patterns for a profile: best day of week, best hour, format performance breakdown, and character length sweet spot. Includes full metric breakdown (likes, comments, shares, conversation rate) for every bucket. All metrics relative to the user's own baseline. Pass `scope` (a post_collections.id) to recompute the patterns against a specific collection.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "profile_id"
      ],
      "properties": {
        "scope": {
          "type": "string",
          "description": "Optional post_collections.id to scope the analysis"
        },
        "date_to": {
          "type": "string",
          "description": "End date (ISO 8601)"
        },
        "date_from": {
          "type": "string",
          "description": "Start date (ISO 8601)"
        },
        "profile_id": {
          "type": "string",
          "description": "Tracked profile ID from list_profiles"
        }
      },
      "additionalProperties": false
    }
    arguments 26 lines
  • get_topic_insights auth-required never probed

    Surface the most-frequent topics in a profile's posts, with engagement context. Returns top N unigrams and (optionally) top N bigrams ranked by post count, each with avg_engagement, vs_baseline, and a sample_post_url. Mirrors the dashboard topics chart, server-side. Pass `scope` (a post_collections.id) to scope the analysis to a collection.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "profile_id"
      ],
      "properties": {
        "n": {
          "type": "integer",
          "maximum": 100,
          "minimum": 1,
          "description": "Max terms per list (default 15)"
        },
        "scope": {
          "type": "string",
          "description": "Optional post_collections.id to scope the analysis"
        },
        "bigrams": {
          "type": "boolean",
          "description": "Also compute and return top bigrams (default true)"
        },
        "date_to": {
          "type": "string",
          "description": "End date (ISO 8601)"
        },
        "date_from": {
          "type": "string",
          "description": "Start date (ISO 8601)"
        },
        "profile_id": {
          "type": "string",
          "description": "Tracked profile ID from list_profiles"
        }
      },
      "additionalProperties": false
    }
    arguments 36 lines
  • get_engagement_trends auth-required never probed

    Get engagement time series for a profile with gap-filled buckets, rolling averages, and trend direction. Each bucket includes avg engagement, likes, comments, shares, and conversation rate. Useful for understanding whether engagement is growing or declining. Pass `scope` (a post_collections.id) to plot trends for a specific collection.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "profile_id"
      ],
      "properties": {
        "scope": {
          "type": "string",
          "description": "Optional post_collections.id to scope the time series"
        },
        "date_to": {
          "type": "string",
          "description": "End date (ISO 8601)"
        },
        "date_from": {
          "type": "string",
          "description": "Start date (ISO 8601)"
        },
        "profile_id": {
          "type": "string",
          "description": "Tracked profile ID from list_profiles"
        },
        "granularity": {
          "enum": [
            "daily",
            "weekly",
            "monthly"
          ],
          "type": "string",
          "default": "weekly",
          "description": "Time bucket granularity"
        },
        "rolling_window": {
          "type": "number",
          "maximum": 30,
          "minimum": 2,
          "description": "Rolling average window size in buckets (default: 4 for weekly, 7 for daily, 3 for monthly)"
        }
      },
      "additionalProperties": false
    }
    arguments 42 lines
  • search_posts auth-required never probed

    Keyword + semantic search over persisted posts in the local library — full-text + pgvector cosine, no LinkedIn pull, free. Use this when the caller has a query string and wants ranked persisted-post results. Pass `scope` (a post_collections.id) to limit to a specific collection. For fresh LinkedIn keyword pulls, use `linkedin_post_search` instead (5 credits).

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "profile_id",
        "query"
      ],
      "properties": {
        "mode": {
          "enum": [
            "hybrid",
            "keyword",
            "semantic"
          ],
          "type": "string",
          "default": "hybrid",
          "description": "Search mode: hybrid (keyword + semantic), keyword (FTS only), or semantic (embedding similarity only)"
        },
        "limit": {
          "type": "number",
          "default": 20,
          "maximum": 50,
          "minimum": 1,
          "description": "Max results to return"
        },
        "query": {
          "type": "string",
          "description": "Search query (e.g. 'cybersecurity tips', 'leadership')"
        },
        "scope": {
          "type": "string",
          "description": "Optional post_collections.id to restrict results to a collection"
        },
        "profile_id": {
          "type": "string",
          "description": "Tracked profile ID from list_profiles"
        }
      },
      "additionalProperties": false
    }
    arguments 40 lines
  • get_cost_estimate auth-required never probed

    Given an MCP tool name, return its credit cost so you can preview an action before running it. Also accepts a stream type (external_profile, company, topic, person_interests, hiring_signals, ad_watch) to preview the per-page cost create_stream / run_stream_now will charge. Returns { tool_name, cost, balance, sufficient, stream_cost? }. Tools not in the registry are assumed to cost 0. Free.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "tool_name"
      ],
      "properties": {
        "params": {
          "type": "object",
          "description": "Reserved for future per-call estimation",
          "additionalProperties": {}
        },
        "tool_name": {
          "type": "string",
          "description": "MCP tool name (e.g. 'get_posts') or stream type (e.g. 'external_profile')"
        }
      },
      "additionalProperties": false
    }
    arguments 19 lines
  • create_stream auth-required never probed

    Create a new research stream (external profile, company, topic, person interests, hiring signals, or ad watch). Running the stream on its schedule costs credits (see get_cost_estimate for the per-type cost). own_profile streams are not created here — they come from subscription checkout.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "type",
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "User-facing label for this stream"
        },
        "type": {
          "enum": [
            "external_profile",
            "company",
            "topic",
            "person_interests",
            "hiring_signals",
            "ad_watch"
          ],
          "type": "string",
          "description": "Stream type"
        },
        "params": {
          "type": "object",
          "description": "Type-specific config: topic uses {query, authorsIndustryId?, contentType?, postedLimit?, sortBy?}; hiring_signals/ad_watch use {company?, keywords?, ...}",
          "additionalProperties": {}
        },
        "schedule": {
          "enum": [
            "once",
            "daily",
            "weekly",
            "monthly",
            "manual"
          ],
          "type": "string",
          "description": "Run schedule. Defaults to 'weekly'. 'monthly' runs every 30 days — the cheapest recurring cadence, and the usual choice for client profiles reported on monthly."
        },
        "source_url": {
          "type": "string",
          "description": "LinkedIn URL for external_profile / company / person_interests streams"
        },
        "history_days": {
          "type": "integer",
          "maximum": 366,
          "minimum": 1,
          "description": "How far back the first run should reach, in days. Bounds the walk by TIME where initial_max_pages bounds it by COST — the run stops at whichever limit it hits first, so pair a window with enough pages to reach it. Honoured for external_profile, company and person_interests; the search types ignore it. Applies to this pull alone and is never saved on the stream, so scheduled runs keep topping up from where the last one stopped rather than re-fetching the window."
        },
        "initial_max_pages": {
          "type": "integer",
          "maximum": 50,
          "minimum": 1,
          "description": "Opt-in deep first-run for external_profile, company and person_interests streams (1-5, default 1). A budget, not a price — you are billed for pages actually walked. A page is ~50 posts for profile/company feeds and ~100 engagement events for person_interests. Other stream types ignore this. Later scheduled runs pull one page in the steady state; a person_interests stream may walk further to close a gap after a missed tick, and is billed only for what it walks."
        }
      },
      "additionalProperties": false
    }
    arguments 59 lines
  • list_streams auth-required never probed

    List all research streams for the authenticated user (external profiles, companies, topics, person interests, hiring signals, ad watches, and own_profile). Pass `type` to filter. Replaces list_profiles for the streams-first world, but list_profiles continues to work for V1-compatible callers.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "type": {
          "enum": [
            "own_profile",
            "external_profile",
            "company",
            "topic",
            "person_interests",
            "hiring_signals",
            "ad_watch"
          ],
          "type": "string",
          "description": "Filter by stream type"
        },
        "include_inactive": {
          "type": "boolean",
          "default": false,
          "description": "Include paused streams (active = false)"
        }
      },
      "additionalProperties": false
    }
    arguments 25 lines
  • get_stream_feed auth-required never probed

    Return the most recent posts a stream has collected into the library, newest first by published_at. Use this to browse what a topic / external profile / person_interests / company stream has surfaced on its schedule.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "stream_id"
      ],
      "properties": {
        "limit": {
          "type": "number",
          "default": 20,
          "maximum": 50,
          "minimum": 1,
          "description": "Max posts to return"
        },
        "stream_id": {
          "type": "string",
          "description": "Stream ID from list_streams"
        }
      },
      "additionalProperties": false
    }
    arguments 21 lines
  • pause_stream auth-required never probed

    Pause a stream so it stops running on its cron schedule. Existing posts remain in the library. Use resume_stream to re-enable it. own_profile streams are billing-managed and cannot be paused here.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "stream_id"
      ],
      "properties": {
        "stream_id": {
          "type": "string",
          "description": "Stream ID from list_streams"
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • resume_stream auth-required never probed

    Resume a paused stream. Sets active=true and queues it to run on the next cron tick by clearing next_run_at. own_profile streams are billing-managed and cannot be resumed here.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "stream_id"
      ],
      "properties": {
        "stream_id": {
          "type": "string",
          "description": "Stream ID from list_streams"
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • delete_stream auth-required never probed

    Delete a stream and its stream_runs. Posts collected by the stream stay in your library (stream_id is set to NULL via ON DELETE SET NULL) so historical data isn't lost. Auto-collection is deleted with the stream. own_profile streams cannot be deleted through this tool; the own profile is managed from Settings and billing.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "stream_id"
      ],
      "properties": {
        "stream_id": {
          "type": "string",
          "description": "Stream ID from list_streams"
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • run_stream_now auth-required never probed

    Trigger an immediate run of an active stream, bypassing its schedule. The run is fire-and-forget — the response confirms the dispatch but post collection happens asynchronously. Credits are charged for pages actually walked, not pages requested: one page is taken upfront and the rest settled when the run finishes, so a run that stops early (or fails) costs less than max_pages implies. Paused streams must be resumed first. Use list_streams or get_stream_feed to see results once the run completes.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "stream_id"
      ],
      "properties": {
        "resume": {
          "type": "boolean",
          "description": "Continue a person_interests backfill from where the deepest previous run stopped, instead of re-walking the newest pages. Use this for 'pull more history' — without it you re-fetch and re-pay for content you already have. No effect on a stream that has never been walked."
        },
        "max_pages": {
          "type": "integer",
          "maximum": 50,
          "minimum": 1,
          "description": "Upper bound on pages for this run (1-5, default 1) — a budget, not a price. Honoured for external_profile, company and person_interests. You are billed only for pages actually walked; a person_interests stream stops as soon as it reaches engagement it already has, so a deep budget usually costs one page. A page is ~50 posts for profile/company feeds and ~100 engagement events for person_interests, where one page means one reactions call plus one comments call. Other stream types ignore this — their sources aren't paginated."
        },
        "stream_id": {
          "type": "string",
          "description": "Stream ID from list_streams"
        },
        "history_days": {
          "type": "integer",
          "maximum": 366,
          "minimum": 1,
          "description": "How far back this run should reach, in days. Bounds the walk by TIME where max_pages bounds it by COST — it stops at whichever limit it hits first, so pair a deep window with enough pages to reach it. Honoured for external_profile, company and person_interests; the search types ignore it. Applies to this run alone; it is never saved on the stream. Combines with resume: 'go further back, but only as far as this'."
        }
      },
      "additionalProperties": false
    }
    arguments 30 lines
  • linkedin_profile_info auth-required never probed

    Fetch a LinkedIn person profile (headline, current role, work history, education, location). Costs 5 credits per call. Results are upserted into `people` (structured fields) and `linkedin_profiles` (so profile-brief renders) — same enrichment side-effect as the other linkedin_profile_* tools.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "linkedin_url"
      ],
      "properties": {
        "refresh": {
          "type": "boolean",
          "description": "Bypass the cache and fetch a fresh copy from LinkedIn (costs 5 credits). Default false: a previously-fetched result is returned free, with how long ago it was retrieved."
        },
        "linkedin_url": {
          "type": "string",
          "description": "LinkedIn profile URL (e.g. https://www.linkedin.com/in/username)"
        }
      },
      "additionalProperties": false
    }
    arguments 18 lines
  • linkedin_profile_posts auth-required never probed

    Fetch recent posts from a LinkedIn person profile. 5 credits per page of 50, up to 250 posts, charged only for pages actually fetched. Results are stored in the post library (source_type='external') and linked to a linkedin_profiles row so profile-brief can render research-only prospects.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "linkedin_url"
      ],
      "properties": {
        "refresh": {
          "type": "boolean",
          "description": "Bypass the cache and re-fetch from LinkedIn (5 credits per page of 50, charged only for pages actually fetched). Default false: a previously-fetched result is returned free, with how long ago it was retrieved."
        },
        "max_posts": {
          "type": "number",
          "default": 50,
          "maximum": 250,
          "minimum": 1,
          "description": "Maximum posts to return (1-250). 5 credits per page of 50, charged only for pages actually fetched."
        },
        "linkedin_url": {
          "type": "string",
          "description": "LinkedIn profile URL (e.g. https://www.linkedin.com/in/username)"
        }
      },
      "additionalProperties": false
    }
    arguments 25 lines
  • linkedin_company_posts auth-required never probed

    Fetch recent posts from a LinkedIn company page. 5 credits per page of 50, up to 250 posts, charged only for pages actually fetched. Results are stored in the post library (source_type='external') and linked to a linkedin_profiles row (profile_type='company').

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "linkedin_url"
      ],
      "properties": {
        "refresh": {
          "type": "boolean",
          "description": "Bypass the cache and re-fetch from LinkedIn (5 credits per page of 50, charged only for pages actually fetched). Default false: a previously-fetched result is returned free, with how long ago it was retrieved."
        },
        "max_posts": {
          "type": "number",
          "default": 50,
          "maximum": 250,
          "minimum": 1,
          "description": "Maximum posts to return (1-250). 5 credits per page of 50, charged only for pages actually fetched."
        },
        "linkedin_url": {
          "type": "string",
          "description": "LinkedIn company URL (e.g. https://www.linkedin.com/company/acme)"
        }
      },
      "additionalProperties": false
    }
    arguments 25 lines
  • linkedin_post_search auth-required never probed

    Search LinkedIn posts by keyword. Costs 5 credits per call. Returns a single page of matching posts.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "query"
      ],
      "properties": {
        "query": {
          "type": "string",
          "description": "Search query / keywords"
        },
        "filters": {
          "type": "object",
          "properties": {
            "sortBy": {
              "type": "string",
              "description": "Sort order (e.g. relevance, date)"
            },
            "contentType": {
              "type": "string",
              "description": "Content type filter (e.g. video, article)"
            },
            "postedLimit": {
              "type": "string",
              "description": "Recency filter. Supported values: '24h', 'week', 'month'"
            },
            "authorsIndustryId": {
              "type": "string",
              "description": "LinkedIn industry ID to filter authors"
            }
          },
          "description": "Optional filters",
          "additionalProperties": false
        },
        "refresh": {
          "type": "boolean",
          "description": "Bypass the cache and re-run the search live (costs 5 credits). Default false: a previously-fetched result is returned free, with how long ago it was retrieved."
        }
      },
      "additionalProperties": false
    }
    arguments 41 lines
  • linkedin_profile_reactions auth-required never probed

    Fetch the recent posts a LinkedIn person has reacted to. Useful for inferring interests. Costs 5 credits per call.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "linkedin_url"
      ],
      "properties": {
        "refresh": {
          "type": "boolean",
          "description": "Bypass the cache and re-fetch from LinkedIn (costs 5 credits). Default false: a previously-fetched result is returned free, with how long ago it was retrieved."
        },
        "linkedin_url": {
          "type": "string",
          "description": "LinkedIn profile URL of the person whose reactions you want"
        }
      },
      "additionalProperties": false
    }
    arguments 18 lines
  • linkedin_profile_comments auth-required never probed

    Fetch the recent posts a LinkedIn person has commented on. Useful for inferring interests and conversation partners. Costs 5 credits per call.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "linkedin_url"
      ],
      "properties": {
        "refresh": {
          "type": "boolean",
          "description": "Bypass the cache and re-fetch from LinkedIn (costs 5 credits). Default false: a previously-fetched result is returned free, with how long ago it was retrieved."
        },
        "linkedin_url": {
          "type": "string",
          "description": "LinkedIn profile URL of the person whose comments you want"
        }
      },
      "additionalProperties": false
    }
    arguments 18 lines
  • linkedin_job_search auth-required never probed

    Search LinkedIn job postings. Useful for tracking hiring signals at target companies. Costs 5 credits per call.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "keywords"
      ],
      "properties": {
        "sortBy": {
          "enum": [
            "relevance",
            "date"
          ],
          "type": "string",
          "description": "Sort order. 'date' is the useful one for hiring signal. Default: relevance."
        },
        "refresh": {
          "type": "boolean",
          "description": "Bypass the cache and re-run the search live (costs 5 credits). Default false: a previously-fetched result is returned free, with how long ago it was retrieved."
        },
        "keywords": {
          "type": "string",
          "description": "Job title keywords (e.g. 'staff engineer python')"
        },
        "location": {
          "type": "string",
          "description": "Location filter (e.g. 'San Francisco, CA')"
        },
        "companyId": {
          "type": "string",
          "description": "Restrict to a LinkedIn company ID (numeric, e.g. '1441'). Not a name or slug — resolve one first with linkedin_company_search, which returns each company's id."
        },
        "postedLimit": {
          "enum": [
            "24h",
            "week",
            "month"
          ],
          "type": "string",
          "description": "Only jobs posted within this window."
        }
      },
      "additionalProperties": false
    }
    arguments 43 lines
  • linkedin_people_search auth-required never probed

    Search LinkedIn people. Filter by company, title, location, or free-text keywords. Costs 5 credits per call. Returns a single page of matching profiles.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "title": {
          "type": "string",
          "description": "Current title filter (e.g. 'Director')"
        },
        "company": {
          "type": "string",
          "description": "Current company name or LinkedIn slug"
        },
        "refresh": {
          "type": "boolean",
          "description": "Bypass the cache and re-run the search live (costs 5 credits). Default false: a previously-fetched result is returned free, with how long ago it was retrieved."
        },
        "keywords": {
          "type": "string",
          "description": "Free-text search (e.g. 'data engineer fintech')"
        },
        "location": {
          "type": "string",
          "description": "Location filter (e.g. 'New York')"
        }
      },
      "additionalProperties": false
    }
    arguments 27 lines
  • linkedin_company_search auth-required never probed

    Search LinkedIn companies. Filter by keywords, industryId, or location. Costs 5 credits per call. Returns a single page of matching companies.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "refresh": {
          "type": "boolean",
          "description": "Bypass the cache and re-run the search live (costs 5 credits). Default false: a previously-fetched result is returned free, with how long ago it was retrieved."
        },
        "keywords": {
          "type": "string",
          "description": "Free-text search (e.g. 'b2b saas analytics')"
        },
        "location": {
          "type": "string",
          "description": "Location filter (e.g. 'San Francisco Bay Area')"
        },
        "industryId": {
          "type": "string",
          "description": "LinkedIn industry ID (numeric, comma-separated for several). Not an industry name — IDs are LinkedIn's industry codes (V2), listed at https://learn.microsoft.com/en-us/linkedin/shared/references/reference-tables/industry-codes-v2"
        }
      },
      "additionalProperties": false
    }
    arguments 23 lines
  • linkedin_post_reactions auth-required never probed

    Fetch the people who reacted to a single LinkedIn post. Costs 5 credits per call. Engagers (with reaction kind) are persisted to the post_engagements graph so subsequent queries about who-engages-with-whom are SQL, not API calls.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "post_url"
      ],
      "properties": {
        "refresh": {
          "type": "boolean",
          "description": "Bypass the cache and re-fetch from LinkedIn (costs 5 credits). Default false: a previously-fetched result is returned free, with how long ago it was retrieved."
        },
        "post_url": {
          "type": "string",
          "description": "Public LinkedIn post URL (e.g. https://www.linkedin.com/feed/update/urn:li:activity:1234)"
        }
      },
      "additionalProperties": false
    }
    arguments 18 lines
  • find_similar_posts auth-required never probed

    Find persisted posts whose embeddings are nearest to a free-text query — pgvector cosine over the local post library, no LinkedIn pull, free. Use when you have a *block of text* (a draft, a paragraph, a competitor's post) and want similar posts you've already collected. For keyword search prefer `search_posts`; for fresh LinkedIn keyword pulls use `linkedin_post_search`. Pass `profile_id` to scope to a tracked profile, `collection_id` to scope to a collection, or neither to search the entire library.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "text"
      ],
      "properties": {
        "text": {
          "type": "string",
          "minLength": 1,
          "description": "Text to find similar posts for"
        },
        "limit": {
          "type": "number",
          "default": 5,
          "maximum": 50,
          "minimum": 1,
          "description": "Max results to return (1-50, default 5)"
        },
        "profile_id": {
          "type": "string",
          "description": "Optional tracked profile ID from list_profiles (scopes search to this profile's posts)"
        },
        "collection_id": {
          "type": "string",
          "description": "Optional post_collections.id (scopes search to this collection's members)"
        }
      },
      "additionalProperties": false
    }
    arguments 30 lines
  • score_draft auth-required never probed

    Predict how a draft post will perform against the user's historical data. Uses an OLS regression model with detrending, ridge regularization, and recency weighting — the same model used on the /score page. Returns a predicted engagement percentile, projected engagement range, factor breakdown, similar past posts, and improvement suggestions. Free. Pass `profile_id` to scope to a tracked profile, `collection_id` to scope to a collection, or neither to score against the user's full library.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "text",
        "day_of_week",
        "hour"
      ],
      "properties": {
        "hour": {
          "type": "number",
          "maximum": 23,
          "minimum": 0,
          "description": "Planned hour (0-23, UTC)"
        },
        "text": {
          "type": "string",
          "minLength": 1,
          "description": "Draft post text"
        },
        "format": {
          "enum": [
            "text",
            "image",
            "video",
            "document",
            "article",
            "poll"
          ],
          "type": "string",
          "default": "text",
          "description": "Post format: text, image, video, document, article, or poll"
        },
        "profile_id": {
          "type": "string",
          "description": "Optional tracked profile ID (scopes the model to this profile's posts)"
        },
        "day_of_week": {
          "type": "number",
          "maximum": 6,
          "minimum": 0,
          "description": "Planned day of week (0=Sunday, 6=Saturday, UTC)"
        },
        "collection_id": {
          "type": "string",
          "description": "Optional post_collections.id (scopes the model to this collection)"
        }
      },
      "additionalProperties": false
    }
    arguments 50 lines
  • suggest_angles auth-required never probed

    Given a topic, suggest distinct content angles informed by what performs well in the user's scoped data. Pulls top-performing historical posts as context and calls OpenAI to generate 5 concrete angles. Costs 5 credits per call. Pass `profile_id` to scope to a tracked profile, `collection_id` to scope to a collection, or neither to use the user's full library.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "topic"
      ],
      "properties": {
        "topic": {
          "type": "string",
          "minLength": 2,
          "description": "Topic or theme to generate angles for (e.g. 'onboarding new hires', 'pricing strategy')"
        },
        "profile_id": {
          "type": "string",
          "description": "Optional tracked profile ID (scopes to this profile's posts)"
        },
        "collection_id": {
          "type": "string",
          "description": "Optional post_collections.id (scopes to this collection's members)"
        }
      },
      "additionalProperties": false
    }
    arguments 23 lines
  • create_segment auth-required never probed

    Create a new audience segment (named group of people) for the authenticated user. Set type='manual' for a hand-curated list (use add_to_segment to populate it), type='smart' with a `config` predicate (e.g. {title_contains:'VP'}) to define a dynamic segment resolved on-demand by resolve_segment, or pass `template` to pre-fill `config` from a built-in template (type defaults to 'smart'). Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "description": "User-facing segment name. Optional when `template` is supplied — the template's default name is used."
        },
        "type": {
          "enum": [
            "manual",
            "smart",
            "auto_stream"
          ],
          "type": "string",
          "description": "Segment type. 'manual' = hand-curated person list. 'smart' = dynamic predicate (requires `config`). 'auto_stream' = system-managed from a stream. Defaults to 'smart' when `template` is provided."
        },
        "config": {
          "type": "object",
          "description": "Predicate object for smart segments. Supported keys: title_contains, company_contains, company_industry, engaged_with_topics. Required when type='smart' and no template is supplied.",
          "additionalProperties": {}
        },
        "template": {
          "enum": [
            "vp_plus",
            "c_suite",
            "heads_of",
            "founders",
            "fintech_leaders",
            "agency_owners"
          ],
          "type": "string",
          "description": "Optional pre-built template id. Available: 'vp_plus' (VP+ decision-makers), 'c_suite' (C-suite executives), 'heads_of' ('Head of' leaders), 'founders' (Founders & co-founders), 'fintech_leaders' (Fintech leaders), 'agency_owners' (Agency owners). Pre-fills `config` and defaults `type` to 'smart'. Explicit `config` overrides template values on collision."
        },
        "description": {
          "type": "string",
          "maxLength": 2000,
          "description": "Optional longer description"
        },
        "source_stream_id": {
          "type": "string",
          "format": "uuid",
          "description": "Optional stream that produced this segment (for traceability)"
        }
      },
      "additionalProperties": false
    }
    arguments 49 lines
  • add_to_segment auth-required never probed

    Add one or more people (by person_id) to an audience segment. Existing members are silently ignored. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "segment_id",
        "person_ids"
      ],
      "properties": {
        "person_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uuid"
          },
          "maxItems": 1000,
          "minItems": 1,
          "description": "person_ids to add (1-1000 per call)"
        },
        "segment_id": {
          "type": "string",
          "format": "uuid",
          "description": "Target segment id from list_segments"
        }
      },
      "additionalProperties": false
    }
    arguments 26 lines
  • resolve_segment auth-required never probed

    Resolve an audience segment into a concrete list of person_ids. For manual / auto_stream segments, returns stored members. For smart segments, evaluates the segment's `config` predicate against the people table and returns matches. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "segment_id"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 1000,
          "maximum": 5000,
          "minimum": 1,
          "description": "Max person_ids to return (default 1000)"
        },
        "segment_id": {
          "type": "string",
          "format": "uuid",
          "description": "Segment id (from list_segments / create_segment)"
        }
      },
      "additionalProperties": false
    }
    arguments 22 lines
  • create_collection auth-required never probed

    Create a new post collection for the authenticated user. Set type='manual' to hand-curate posts with add_to_collection, or type='smart' with a `config` predicate (e.g. {format:'video',min_likes:50}) to define a dynamic collection resolved on-demand by resolve_collection. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "name",
        "type"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "description": "User-facing collection name"
        },
        "type": {
          "enum": [
            "manual",
            "smart"
          ],
          "type": "string",
          "description": "'manual' = hand-curated post list. 'smart' = dynamic predicate (requires `config`)."
        },
        "config": {
          "type": "object",
          "description": "Predicate for smart collections. Supported keys: format, min_likes, min_comments, date_after, date_before, topic_contains, author_profile_id, profile_ids (array — posts whose profile_id is in the set; use to group several tracked profiles/streams into one live collection), source_type. Required when type='smart'.",
          "additionalProperties": {}
        },
        "description": {
          "type": "string",
          "maxLength": 2000,
          "description": "Optional longer description"
        }
      },
      "additionalProperties": false
    }
    arguments 35 lines
  • add_to_collection auth-required never probed

    Pin one or more posts (by post_id) into a collection you own — works on any collection type. On a 'manual' collection this is the only membership mechanism; on a 'smart' collection it adds the posts as extras alongside whatever the rule already matches (resolve_collection returns the union). Existing members are silently ignored. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "collection_id",
        "post_ids"
      ],
      "properties": {
        "post_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uuid"
          },
          "maxItems": 1000,
          "minItems": 1,
          "description": "post_ids to add (1-1000 per call)"
        },
        "collection_id": {
          "type": "string",
          "format": "uuid",
          "description": "Target collection id from list_collections"
        }
      },
      "additionalProperties": false
    }
    arguments 26 lines
  • remove_from_collection auth-required never probed

    Remove one or more posts (by post_id) from a collection. Missing members are silently ignored. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "collection_id",
        "post_ids"
      ],
      "properties": {
        "post_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uuid"
          },
          "maxItems": 1000,
          "minItems": 1,
          "description": "post_ids to remove (1-1000 per call)"
        },
        "collection_id": {
          "type": "string",
          "format": "uuid",
          "description": "Target collection id from list_collections"
        }
      },
      "additionalProperties": false
    }
    arguments 26 lines
  • list_collections auth-required never probed

    List all post collections for the authenticated user, with member counts. Includes manual collections, smart collections (predicate-based), and auto_stream collections (system-managed). Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "type": {
          "enum": [
            "manual",
            "smart",
            "auto_stream"
          ],
          "type": "string",
          "description": "Optional filter by collection type"
        }
      },
      "additionalProperties": false
    }
    arguments 16 lines
  • resolve_collection auth-required never probed

    Resolve a post collection into a concrete list of post_ids. For manual / auto_stream collections, returns stored members. For smart collections, evaluates the collection's `config` predicate against the user's posts and returns matches. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "collection_id"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 1000,
          "maximum": 5000,
          "minimum": 1,
          "description": "Max post_ids to return (default 1000)"
        },
        "collection_id": {
          "type": "string",
          "format": "uuid",
          "description": "Collection id (from list_collections / create_collection)"
        }
      },
      "additionalProperties": false
    }
    arguments 22 lines
  • add_campaign_accounts auth-required never probed

    Add one or more target companies to a Constellation campaign. Each account is a company you want to reach; map_constellation is then run per-account. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "campaign_id",
        "accounts"
      ],
      "properties": {
        "accounts": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "company_name"
            ],
            "properties": {
              "tier": {
                "type": "integer",
                "maximum": 3,
                "minimum": 1
              },
              "company_name": {
                "type": "string",
                "maxLength": 500,
                "minLength": 1
              },
              "employee_count": {
                "type": "integer",
                "exclusiveMinimum": 0
              },
              "linkedin_company_id": {
                "type": "string"
              }
            },
            "additionalProperties": false
          },
          "maxItems": 500,
          "minItems": 1,
          "description": "Array of companies to add (1-500 per call)"
        },
        "campaign_id": {
          "type": "string",
          "format": "uuid",
          "description": "Target campaign id"
        }
      },
      "additionalProperties": false
    }
    arguments 48 lines
  • map_constellation auth-required never probed

    Map the professional graph around a target company. Finds senior decision-makers at the account, pulls each target's recent posts/reactions/comments to identify engagers, then scores every connection and produces a prioritized outreach queue. Credit cost scales with targets — bounded by `max_targets`. Max spend per call is ~175 credits; actual cost is reported in the response.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "campaign_account_id"
      ],
      "properties": {
        "max_targets": {
          "type": "integer",
          "default": 5,
          "maximum": 20,
          "minimum": 1,
          "description": "Max targets to deep-map per account (1-20, default 5). Each target adds ~3 credits."
        },
        "title_keywords": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "description": "Title keywords to filter targets. Default: ['VP','Director','Head of','Chief']"
        },
        "campaign_account_id": {
          "type": "string",
          "format": "uuid",
          "description": "campaign_accounts.id — the company to map"
        }
      },
      "additionalProperties": false
    }
    arguments 30 lines
  • score_connections auth-required never probed

    Re-score all constellation entries in a campaign and rewrite queue positions from highest to lowest composite score. Use after new engagers or targets are added. Free — costs 0 credits. Note: this tool requires a `campaign_id` because it writes back to the `constellation_entries` table. Segment- and url-list-scoped scoring is not yet supported — use `get_outreach_queue({segment_id})` or `get_outreach_queue({linkedin_urls})` for engagement-count ordering on those scopes; full composite scoring will land alongside the unified person-positions schema in a later phase.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "campaign_id"
      ],
      "properties": {
        "campaign_id": {
          "type": "string",
          "format": "uuid",
          "description": "Campaign id to re-score"
        }
      },
      "additionalProperties": false
    }
    arguments 15 lines
  • get_outreach_queue auth-required never probed

    Return a prioritized outreach queue. Provide *exactly one* of three scopes: • `campaign_id` — full Constellation queue with composite_score, pool, recommended_action, and prior outreach_log entries (the original campaign-scoped behavior). • `segment_id` — people in a saved audience segment, ranked by their engagement count against your tracked profiles' posts. No composite_score. • `linkedin_urls` — an ad-hoc list of LinkedIn URLs, same engagement-count ranking as segments. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "pool": {
          "enum": [
            "coworker",
            "engager",
            "mutual"
          ],
          "type": "string",
          "description": "Optional filter: only return entries in this pool. Only meaningful for `campaign_id` scope; ignored for segment / urls."
        },
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 200,
          "minimum": 1,
          "description": "Max entries to return (1-200, default 50)"
        },
        "segment_id": {
          "type": "string",
          "format": "uuid",
          "description": "Audience segment id (engagement-count scoring)"
        },
        "campaign_id": {
          "type": "string",
          "format": "uuid",
          "description": "Campaign id (full Constellation scoring)"
        },
        "linkedin_urls": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 200,
          "description": "Ad-hoc LinkedIn URL list (engagement-count scoring); max 200"
        }
      },
      "additionalProperties": false
    }
    arguments 41 lines
  • get_engagement_brief auth-required never probed

    For one person, return their recent posts most relevant to what you post about — plus suggested talking points. Use before a warm comment or DM. Free — costs 0 credits. Identify the person via *exactly one* of: `target_id` (a Constellation target — original input), `person_id` (a row in `people`), or `linkedin_url` (any form). The non-campaign forms work even when no Constellation campaign exists.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "person_id": {
          "type": "string",
          "format": "uuid",
          "description": "people.id — when you already have the canonical person row"
        },
        "target_id": {
          "type": "string",
          "format": "uuid",
          "description": "Constellation targets.id — for the original campaign-scoped flow"
        },
        "linkedin_url": {
          "type": "string",
          "description": "LinkedIn profile URL (vanity or encoded form) — auto-resolved to a people row"
        }
      },
      "additionalProperties": false
    }
    arguments 21 lines
  • log_outcome auth-required never probed

    Append an entry to the outreach log for a Constellation campaign. Use to record connection requests, acceptances, replies, or no-responses so get_campaign_stats can compute acceptance / reply rates over time. Free — costs 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "campaign_id",
        "person_id",
        "action"
      ],
      "properties": {
        "note": {
          "type": "string",
          "maxLength": 4000,
          "description": "Optional free-text note"
        },
        "action": {
          "enum": [
            "sent_request",
            "accepted",
            "replied",
            "no_response"
          ],
          "type": "string",
          "description": "Outreach event: sent_request | accepted | replied | no_response"
        },
        "person_id": {
          "type": "string",
          "format": "uuid",
          "description": "people.id — the person you outreached to"
        },
        "campaign_id": {
          "type": "string",
          "format": "uuid",
          "description": "Campaign id"
        }
      },
      "additionalProperties": false
    }
    arguments 37 lines
  • save_post auth-required never probed

    Save a LinkedIn post to your library by its URL. Resolves the post and stores it with source_type='saved'. Optionally pins the post into any collection you own (manual or smart — pinning into a smart collection adds it as an extra alongside the rule's matches). Costs 1 credit per call. Failed lookups don't charge.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "url"
      ],
      "properties": {
        "url": {
          "type": "string",
          "description": "Public LinkedIn post URL. Accepts linkedin.com/posts/... permalinks and linkedin.com/feed/update/urn:li:activity:... feed URLs."
        },
        "collection_id": {
          "type": "string",
          "format": "uuid",
          "description": "Optional collection UUID to pin the post into. Must be a collection you own — any type."
        }
      },
      "additionalProperties": false
    }
    arguments 19 lines
  • get_post_engagers_by_company auth-required never probed

    Given a LinkedIn post URL or id, return the companies whose people engaged (reacted/commented), ranked by engager count. Joins through person_positions(is_current=true). Pure DB read — no LinkedIn pull, no credits charged. Engagers without a known current company are bucketed as `_unknown_company`. Optional industry_urn filter narrows to one industry.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 20,
          "maximum": 100,
          "minimum": 1,
          "description": "Max companies to return (1-100, default 20)"
        },
        "post_id": {
          "type": "string",
          "format": "uuid",
          "description": "posts.id UUID (use when you already know the local id)"
        },
        "post_url": {
          "type": "string",
          "description": "Public LinkedIn post URL (e.g. https://www.linkedin.com/feed/update/urn:li:activity:1234)"
        },
        "industry_urn": {
          "type": "string",
          "description": "Optional urn:li:fsd_industry:<id> filter (from companies.industry_urn)"
        },
        "top_engagers_per_company": {
          "type": "integer",
          "default": 3,
          "maximum": 10,
          "minimum": 0,
          "description": "How many sample engager names to attach per company row (0-10, default 3)"
        }
      },
      "additionalProperties": false
    }
    arguments 34 lines
  • get_engagement_industry_breakdown auth-required never probed

    Histogram of engagers' companies grouped by industry. Pivots on companies.industry_hierarchy (e.g. 'Tech > Software Development'). Depth=1 buckets by top-level, =2 by top+mid, =3 by full hierarchy. Engagers with no current company / no industry hierarchy bucket as `_unknown`. Pure DB read — no LinkedIn pull, no credits charged.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "depth": {
          "type": "integer",
          "default": 1,
          "maximum": 3,
          "minimum": 1,
          "description": "1=top-level industry, 2=mid, 3=leaf (full hierarchy)"
        },
        "post_id": {
          "type": "string",
          "format": "uuid",
          "description": "posts.id UUID"
        },
        "post_url": {
          "type": "string",
          "description": "Public LinkedIn post URL"
        },
        "sample_companies_per_bucket": {
          "type": "integer",
          "default": 3,
          "maximum": 10,
          "minimum": 0,
          "description": "How many sample company names to attach per industry row (0-10, default 3)"
        }
      },
      "additionalProperties": false
    }
    arguments 30 lines
  • get_target_warmth_brief auth-required never probed

    For a target person, summarize all engagement evidence between them and your collected posts: posts they reacted to, posts they commented on, frequency, recency, reaction kinds, comment text snippets. Computes a v0 warmth score from engagement count, comment signal, and recency. Pure DB read — no LinkedIn pull, no credits charged.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "days_back": {
          "type": "integer",
          "default": 90,
          "maximum": 365,
          "minimum": 1,
          "description": "How far back to look at engagements (default 90)"
        },
        "person_id": {
          "type": "string",
          "format": "uuid",
          "description": "people.id UUID"
        },
        "linkedin_url": {
          "type": "string",
          "description": "Target's LinkedIn profile URL"
        }
      },
      "additionalProperties": false
    }
    arguments 23 lines
  • traverse_graph_help auth-required never probed

    Returns the schema, FK edges, and 5 canonical SQL examples needed to write your own SELECT against the engagement graph via traverse_graph. Also returns YOUR resolvable identities (caller_user_ids, caller_tracked_lp_ids) — substitute these into example SQL when you write your query. Pure DB read — 0 credits. Free.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {}
    }
    arguments 5 lines
  • traverse_graph auth-required never probed

    Executes a TS-validated SELECT-only SQL query against the engagement graph and returns rows. CALL traverse_graph_help FIRST to get schema + caller_user_ids + canonical examples. Required: SQL must start with SELECT or WITH, contain no DML/DDL keywords, and reference one of your caller_user_ids or caller_tracked_lp_ids verbatim. Cap: 1000 rows, 5s statement timeout. Pure DB read — 0 credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "sql"
      ],
      "properties": {
        "sql": {
          "type": "string",
          "minLength": 10,
          "description": "The SELECT/WITH SQL to execute"
        }
      },
      "additionalProperties": false
    }
    arguments 15 lines
  • get_outreach_path auth-required never probed

    Given a target person, find the shortest warm-intro path through your engager network. Walks coworker (shared current company) + alumni (shared past company / school) edges. Up to 3 hops. Pure DB read — no LinkedIn pull, no credits charged.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 10,
          "maximum": 100,
          "minimum": 1,
          "description": "Max paths to return (default 10)"
        },
        "max_hops": {
          "type": "integer",
          "default": 2,
          "maximum": 3,
          "minimum": 1,
          "description": "Max path length (1=direct, 2=one intermediate, 3=two intermediates). Default 2."
        },
        "target_person_id": {
          "type": "string",
          "format": "uuid",
          "description": "Target — people.id UUID"
        },
        "target_linkedin_url": {
          "type": "string",
          "description": "Target — LinkedIn URL"
        }
      },
      "additionalProperties": false
    }
    arguments 30 lines
  • get_post_set_engagers auth-required never probed

    Return the consolidated, deduped people who reacted to or commented on a SET of posts — one tracked profile's posts (profile_id) or a post collection (collection_id). Fetches only posts not synced within freshness_days, and enriches (title/company via a profile lookup) only never-seen people, up to max_enrich. Costs 2 credits per post synced + 3 per person enriched; cached posts are free.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "force": {
          "type": "boolean",
          "default": false,
          "description": "Re-sync posts even if within the freshness window"
        },
        "max_posts": {
          "type": "integer",
          "default": 25,
          "maximum": 100,
          "minimum": 1,
          "description": "Max posts to sync this call (1-100)"
        },
        "max_enrich": {
          "type": "integer",
          "default": 0,
          "maximum": 100,
          "minimum": 0,
          "description": "Max never-seen engagers to enrich via /linkedin/profile (0-100, default 0)"
        },
        "profile_id": {
          "type": "string",
          "description": "Tracked profile id — engagers across this profile's stored posts"
        },
        "collection_id": {
          "type": "string",
          "description": "post_collections.id — engagers across this collection's posts"
        },
        "freshness_days": {
          "type": "integer",
          "default": 30,
          "maximum": 365,
          "minimum": 0,
          "description": "Skip posts whose engagers were synced within this many days"
        }
      },
      "additionalProperties": false
    }
    arguments 41 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 42045790a26f9899.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/42045790a26f9899/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/42045790a26f9899/badge.svg)](https://brick.blue/agent/42045790a26f9899?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.