{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_j2uvvzqvn3m4","handle":"flux-linkedin-mcp","url":"https://wellknown.network/agents/flux-linkedin-mcp","links":{"self":"https://wellknown.network/agents/flux-linkedin-mcp/record.json","html":"https://wellknown.network/agents/flux-linkedin-mcp","markdown":"https://wellknown.network/agents/flux-linkedin-mcp/record.md","api":"https://wellknown.network/api/v1/agents/flux-linkedin-mcp","status":"https://wellknown.network/api/v1/agents/flux-linkedin-mcp/status","claim":"https://wellknown.network/agents/flux-linkedin-mcp/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/flux-linkedin-mcp/claim.json","badge":"https://wellknown.network/agents/flux-linkedin-mcp/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/flux-linkedin-mcp/history","tools":"https://wellknown.network/api/v1/agents/flux-linkedin-mcp/tools"},"ard":{"identifier":"urn:air:www.fluxgraph.app:server:flux-linkedin-mcp","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Flux LinkedIn MCP","summary":"LinkedIn intelligence: post analytics and research for public profiles and company pages.","description":"LinkedIn intelligence: post analytics and research for public profiles and company pages.","publisher":{"name":"app.fluxgraph","url":null},"homepage":"https://www.fluxgraph.app/features/mcp","repository":null,"version":"1.0.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://www.fluxgraph.app/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-11-02T04:04:16.473167Z","publishedAt":"2026-11-02T04:04:16.473167Z","registryName":"app.fluxgraph/linkedin"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"content.writing","name":"Writing & Editing","confidence":1,"provenance":"derived"},{"slug":"content.social","name":"Social Media","confidence":1,"provenance":"derived"},{"slug":"content.marketing","name":"Marketing","confidence":1,"provenance":"derived"},{"slug":"media.image-generation","name":"Image Generation","confidence":1,"provenance":"derived"},{"slug":"data.vector-search","name":"Vector Search","confidence":1,"provenance":"derived"},{"slug":"productivity.hr","name":"HR & Recruiting","confidence":0.992,"provenance":"derived"},{"slug":"automation.workflows","name":"Workflow Automation","confidence":0.977,"provenance":"derived"},{"slug":"data.database","name":"Databases","confidence":0.933,"provenance":"derived"}],"categories":["automation","content","data","media","productivity"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 1h ago.","lastOkAt":"2026-11-07T08:28:55.629Z","lastProbedAt":"2026-11-07T08:28:55.629Z","statusComputedAt":"2026-11-07T08:31:52.435Z","reliability30d":{"probes":9,"successRate":1,"p50Ms":172,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":9,"ok":9,"authBoundaryOk":0,"serviceOk":9,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-11-07T08:28:55.629Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":140,"error":null,"detail":{"tools":[{"name":"list_profiles","description":"List all tracked LinkedIn profiles for the authenticated user. Returns profile IDs needed by other tools."},{"name":"preview_profile","description":"Analyze a public LinkedIn profile or company page without a Flux account: pulls the latest ~50 posts (once per profile) and returns a teaser: post count, averag"},{"name":"preview_posting_insights","description":"Full breakdown for a previewed profile (from preview_profile): best day, hour, format and length, the top and bottom 5 posts with measured reasons, and engageme"},{"name":"preview_search_posts","description":"Keyword search over the latest 50 posts of a previewed profile (from preview_profile). Case-insensitive substring match; returns matching posts ordered by engag"},{"name":"claim_preview","description":"Make a profile from preview_profile your own Flux dashboard. Call this only when the person says the profile is theirs: the person cannot undo a claim. Requires"},{"name":"get_posts","description":"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 alr"},{"name":"get_profile_summary","description":"Get KPI summary for a tracked profile: total posts, average engagement (broken down by likes/comments/shares/conversation rate), posts per week, engagement tren"},{"name":"get_posting_insights","description":"Get optimal posting patterns for a profile: best day of week, best hour, format performance breakdown, and character length sweet spot. Includes full metric bre"},{"name":"get_topic_insights","description":"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"},{"name":"get_engagement_trends","description":"Get engagement time series for a profile with gap-filled buckets, rolling averages, and trend direction. Each bucket includes avg engagement, likes, comments, s"},{"name":"search_posts","description":"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 "},{"name":"get_credit_balance","description":"Return the authenticated user's current credit balance, this period's monthly allocation, and credits used since the period started. Free."},{"name":"get_usage_history","description":"Return recent credit_ledger transactions for the authenticated user. Filter by tool name, reason, or date range. Paginated. Free."},{"name":"get_cost_estimate","description":"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, per"},{"name":"create_stream","description":"Create a new research stream (external profile, company, topic, person interests, hiring signals, or ad watch). Running the stream on its schedule costs credits"},{"name":"list_streams","description":"List all research streams for the authenticated user (external profiles, companies, topics, person interests, hiring signals, ad watches, and own_profile). Pass"},{"name":"get_stream_feed","description":"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_"},{"name":"pause_stream","description":"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 billin"},{"name":"resume_stream","description":"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 "},{"name":"delete_stream","description":"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"},{"name":"run_stream_now","description":"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 happen"},{"name":"linkedin_profile_info","description":"Fetch a LinkedIn person profile (headline, current role, work history, education, location). Costs 5 credits per call. Results are upserted into `people` (struc"},{"name":"linkedin_profile_posts","description":"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"},{"name":"linkedin_company_posts","description":"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 p"},{"name":"linkedin_post_search","description":"Search LinkedIn posts by keyword. Costs 5 credits per call. Returns a single page of matching posts."},{"name":"linkedin_profile_reactions","description":"Fetch the recent posts a LinkedIn person has reacted to. Useful for inferring interests. Costs 5 credits per call."},{"name":"linkedin_profile_comments","description":"Fetch the recent posts a LinkedIn person has commented on. Useful for inferring interests and conversation partners. Costs 5 credits per call."},{"name":"linkedin_job_search","description":"Search LinkedIn job postings. Useful for tracking hiring signals at target companies. Costs 5 credits per call."},{"name":"linkedin_ad_search","description":"Search the LinkedIn ad library. Useful for tracking competitor ad creative and messaging. Costs 10 credits per call."},{"name":"linkedin_people_search","description":"Search LinkedIn people. Filter by company, title, location, or free-text keywords. Costs 5 credits per call. Returns a single page of matching profiles."},{"name":"linkedin_company_search","description":"Search LinkedIn companies. Filter by keywords, industryId, or location. Costs 5 credits per call. Returns a single page of matching companies."},{"name":"linkedin_post_reactions","description":"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 s"},{"name":"linkedin_post_comments","description":"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 "},{"name":"find_similar_posts","description":"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 "},{"name":"score_draft","description":"Predict how a draft post will perform against the user's historical data. Uses an OLS regression model with detrending, ridge regularization, and recency weight"},{"name":"suggest_angles","description":"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 ca"},{"name":"list_segments","description":"List all audience segments for the authenticated user, with member counts. Audience segments are named groups of people (e.g. 'ICP — VPs of Marketing', 'Champio"},{"name":"create_segment","description":"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),"},{"name":"add_to_segment","description":"Add one or more people (by person_id) to an audience segment. Existing members are silently ignored. Free — costs 0 credits."},{"name":"remove_from_segment","description":"Remove one or more people (by person_id) from an audience segment. Missing members are silently ignored. Free — costs 0 credits."},{"name":"resolve_segment","description":"Resolve an audience segment into a concrete list of person_ids. For manual / auto_stream segments, returns stored members. For smart segments, evaluates the seg"},{"name":"list_segment_templates","description":"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 "},{"name":"get_alerts","description":"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 sk"},{"name":"create_collection","description":"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` predicat"},{"name":"add_to_collection","description":"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 "},{"name":"remove_from_collection","description":"Remove one or more posts (by post_id) from a collection. Missing members are silently ignored. Free — costs 0 credits."},{"name":"list_collections","description":"List all post collections for the authenticated user, with member counts. Includes manual collections, smart collections (predicate-based), and auto_stream coll"},{"name":"resolve_collection","description":"Resolve a post collection into a concrete list of post_ids. For manual / auto_stream collections, returns stored members. For smart collections, evaluates the c"},{"name":"create_campaign","description":"Create a Constellation outreach campaign. A campaign groups target accounts, the people you care about at those accounts, and the warm connections you could app"},{"name":"add_campaign_accounts","description":"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 — cos"},{"name":"map_constellation","description":"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"},{"name":"score_connections","description":"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"},{"name":"get_outreach_queue","description":"Return a prioritized outreach queue. Provide *exactly one* of three scopes:\n• `campaign_id` — full Constellation queue with composite_score, pool, recommended_a"},{"name":"get_engagement_brief","description":"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 "},{"name":"log_outcome","description":"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"},{"name":"get_campaign_stats","description":"Summary stats for a Constellation campaign: target count, entry count, outreach volume, and acceptance / reply rates broken down by pool (coworker / engager / m"},{"name":"save_post","description":"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 "},{"name":"get_post_engagers_by_company","description":"Given a LinkedIn post URL or id, return the companies whose people engaged (reacted/commented), ranked by engager count. Joins through person_positions(is_curre"},{"name":"get_engagement_industry_breakdown","description":"Histogram of engagers' companies grouped by industry. Pivots on companies.industry_hierarchy (e.g. 'Tech > Software Development'). Depth=1 buckets by top-level,"},{"name":"get_alumni_engagers","description":"Given a company URL or id, return engagers (across your collected posts) who have a position at that company. Relation filter: 'coworker' = current employees, '"},{"name":"get_engager_position_history","description":"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 c"},{"name":"get_target_warmth_brief","description":"For a target person, summarize all engagement evidence between them and your collected posts: posts they reacted to, posts they commented on, frequency, recency"},{"name":"traverse_graph_help","description":"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 re"},{"name":"traverse_graph","description":"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 + ca"},{"name":"get_company_engagement_overlap","description":"Given two companies, return engagers across your collected posts who engaged with BOTH companies' posts. Cross-account intelligence — finds people interested in"},{"name":"get_outreach_path","description":"Given a target person, find the shortest warm-intro path through your engager network. Walks coworker (shared current company) + alumni (shared past company / s"},{"name":"get_post_set_engagers","description":"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 (collectio"}],"toolCount":67,"toolsHash":"6350188bf28c4599c92dce7da3def0364d397cde8b62db6fa7979478edf87450","serverName":"flux","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-07T00:26:43.766Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":134,"error":null,"detail":{"tools":[{"name":"list_profiles","description":"List all tracked LinkedIn profiles for the authenticated user. Returns profile IDs needed by other tools."},{"name":"preview_profile","description":"Analyze a public LinkedIn profile or company page without a Flux account: pulls the latest ~50 posts (once per profile) and returns a teaser: post count, averag"},{"name":"preview_posting_insights","description":"Full breakdown for a previewed profile (from preview_profile): best day, hour, format and length, the top and bottom 5 posts with measured reasons, and engageme"},{"name":"preview_search_posts","description":"Keyword search over the latest 50 posts of a previewed profile (from preview_profile). Case-insensitive substring match; returns matching posts ordered by engag"},{"name":"claim_preview","description":"Make a profile from preview_profile your own Flux dashboard. Call this only when the person says the profile is theirs: the person cannot undo a claim. Requires"},{"name":"get_posts","description":"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 alr"},{"name":"get_profile_summary","description":"Get KPI summary for a tracked profile: total posts, average engagement (broken down by likes/comments/shares/conversation rate), posts per week, engagement tren"},{"name":"get_posting_insights","description":"Get optimal posting patterns for a profile: best day of week, best hour, format performance breakdown, and character length sweet spot. Includes full metric bre"},{"name":"get_topic_insights","description":"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"},{"name":"get_engagement_trends","description":"Get engagement time series for a profile with gap-filled buckets, rolling averages, and trend direction. Each bucket includes avg engagement, likes, comments, s"},{"name":"search_posts","description":"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 "},{"name":"get_credit_balance","description":"Return the authenticated user's current credit balance, this period's monthly allocation, and credits used since the period started. Free."},{"name":"get_usage_history","description":"Return recent credit_ledger transactions for the authenticated user. Filter by tool name, reason, or date range. Paginated. Free."},{"name":"get_cost_estimate","description":"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, per"},{"name":"create_stream","description":"Create a new research stream (external profile, company, topic, person interests, hiring signals, or ad watch). Running the stream on its schedule costs credits"},{"name":"list_streams","description":"List all research streams for the authenticated user (external profiles, companies, topics, person interests, hiring signals, ad watches, and own_profile). Pass"},{"name":"get_stream_feed","description":"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_"},{"name":"pause_stream","description":"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 billin"},{"name":"resume_stream","description":"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 "},{"name":"delete_stream","description":"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"},{"name":"run_stream_now","description":"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 happen"},{"name":"linkedin_profile_info","description":"Fetch a LinkedIn person profile (headline, current role, work history, education, location). Costs 5 credits per call. Results are upserted into `people` (struc"},{"name":"linkedin_profile_posts","description":"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"},{"name":"linkedin_company_posts","description":"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 p"},{"name":"linkedin_post_search","description":"Search LinkedIn posts by keyword. Costs 5 credits per call. Returns a single page of matching posts."},{"name":"linkedin_profile_reactions","description":"Fetch the recent posts a LinkedIn person has reacted to. Useful for inferring interests. Costs 5 credits per call."},{"name":"linkedin_profile_comments","description":"Fetch the recent posts a LinkedIn person has commented on. Useful for inferring interests and conversation partners. Costs 5 credits per call."},{"name":"linkedin_job_search","description":"Search LinkedIn job postings. Useful for tracking hiring signals at target companies. Costs 5 credits per call."},{"name":"linkedin_ad_search","description":"Search the LinkedIn ad library. Useful for tracking competitor ad creative and messaging. Costs 10 credits per call."},{"name":"linkedin_people_search","description":"Search LinkedIn people. Filter by company, title, location, or free-text keywords. Costs 5 credits per call. Returns a single page of matching profiles."},{"name":"linkedin_company_search","description":"Search LinkedIn companies. Filter by keywords, industryId, or location. Costs 5 credits per call. Returns a single page of matching companies."},{"name":"linkedin_post_reactions","description":"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 s"},{"name":"linkedin_post_comments","description":"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 "},{"name":"find_similar_posts","description":"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 "},{"name":"score_draft","description":"Predict how a draft post will perform against the user's historical data. Uses an OLS regression model with detrending, ridge regularization, and recency weight"},{"name":"suggest_angles","description":"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 ca"},{"name":"list_segments","description":"List all audience segments for the authenticated user, with member counts. Audience segments are named groups of people (e.g. 'ICP — VPs of Marketing', 'Champio"},{"name":"create_segment","description":"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),"},{"name":"add_to_segment","description":"Add one or more people (by person_id) to an audience segment. Existing members are silently ignored. Free — costs 0 credits."},{"name":"remove_from_segment","description":"Remove one or more people (by person_id) from an audience segment. Missing members are silently ignored. Free — costs 0 credits."},{"name":"resolve_segment","description":"Resolve an audience segment into a concrete list of person_ids. For manual / auto_stream segments, returns stored members. For smart segments, evaluates the seg"},{"name":"list_segment_templates","description":"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 "},{"name":"get_alerts","description":"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 sk"},{"name":"create_collection","description":"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` predicat"},{"name":"add_to_collection","description":"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 "},{"name":"remove_from_collection","description":"Remove one or more posts (by post_id) from a collection. Missing members are silently ignored. Free — costs 0 credits."},{"name":"list_collections","description":"List all post collections for the authenticated user, with member counts. Includes manual collections, smart collections (predicate-based), and auto_stream coll"},{"name":"resolve_collection","description":"Resolve a post collection into a concrete list of post_ids. For manual / auto_stream collections, returns stored members. For smart collections, evaluates the c"},{"name":"create_campaign","description":"Create a Constellation outreach campaign. A campaign groups target accounts, the people you care about at those accounts, and the warm connections you could app"},{"name":"add_campaign_accounts","description":"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 — cos"},{"name":"map_constellation","description":"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"},{"name":"score_connections","description":"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"},{"name":"get_outreach_queue","description":"Return a prioritized outreach queue. Provide *exactly one* of three scopes:\n• `campaign_id` — full Constellation queue with composite_score, pool, recommended_a"},{"name":"get_engagement_brief","description":"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 "},{"name":"log_outcome","description":"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"},{"name":"get_campaign_stats","description":"Summary stats for a Constellation campaign: target count, entry count, outreach volume, and acceptance / reply rates broken down by pool (coworker / engager / m"},{"name":"save_post","description":"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 "},{"name":"get_post_engagers_by_company","description":"Given a LinkedIn post URL or id, return the companies whose people engaged (reacted/commented), ranked by engager count. Joins through person_positions(is_curre"},{"name":"get_engagement_industry_breakdown","description":"Histogram of engagers' companies grouped by industry. Pivots on companies.industry_hierarchy (e.g. 'Tech > Software Development'). Depth=1 buckets by top-level,"},{"name":"get_alumni_engagers","description":"Given a company URL or id, return engagers (across your collected posts) who have a position at that company. Relation filter: 'coworker' = current employees, '"},{"name":"get_engager_position_history","description":"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 c"},{"name":"get_target_warmth_brief","description":"For a target person, summarize all engagement evidence between them and your collected posts: posts they reacted to, posts they commented on, frequency, recency"},{"name":"traverse_graph_help","description":"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 re"},{"name":"traverse_graph","description":"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 + ca"},{"name":"get_company_engagement_overlap","description":"Given two companies, return engagers across your collected posts who engaged with BOTH companies' posts. Cross-account intelligence — finds people interested in"},{"name":"get_outreach_path","description":"Given a target person, find the shortest warm-intro path through your engager network. Walks coworker (shared current company) + alumni (shared past company / s"},{"name":"get_post_set_engagers","description":"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 (collectio"}],"toolCount":67,"toolsHash":"6350188bf28c4599c92dce7da3def0364d397cde8b62db6fa7979478edf87450","serverName":"flux","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-06T16:27:57.519Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":166,"error":null,"detail":{"tools":[{"name":"list_profiles","description":"List all tracked LinkedIn profiles for the authenticated user. Returns profile IDs needed by other tools."},{"name":"preview_profile","description":"Analyze a public LinkedIn profile or company page without a Flux account: pulls the latest ~50 posts (once per profile) and returns a teaser: post count, averag"},{"name":"preview_posting_insights","description":"Full breakdown for a previewed profile (from preview_profile): best day, hour, format and length, the top and bottom 5 posts with measured reasons, and engageme"},{"name":"preview_search_posts","description":"Keyword search over the latest 50 posts of a previewed profile (from preview_profile). Case-insensitive substring match; returns matching posts ordered by engag"},{"name":"claim_preview","description":"Make a profile from preview_profile your own Flux dashboard. Call this only when the person says the profile is theirs: the person cannot undo a claim. Requires"},{"name":"get_posts","description":"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 alr"},{"name":"get_profile_summary","description":"Get KPI summary for a tracked profile: total posts, average engagement (broken down by likes/comments/shares/conversation rate), posts per week, engagement tren"},{"name":"get_posting_insights","description":"Get optimal posting patterns for a profile: best day of week, best hour, format performance breakdown, and character length sweet spot. Includes full metric bre"},{"name":"get_topic_insights","description":"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"},{"name":"get_engagement_trends","description":"Get engagement time series for a profile with gap-filled buckets, rolling averages, and trend direction. Each bucket includes avg engagement, likes, comments, s"},{"name":"search_posts","description":"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 "},{"name":"get_credit_balance","description":"Return the authenticated user's current credit balance, this period's monthly allocation, and credits used since the period started. Free."},{"name":"get_usage_history","description":"Return recent credit_ledger transactions for the authenticated user. Filter by tool name, reason, or date range. Paginated. Free."},{"name":"get_cost_estimate","description":"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, per"},{"name":"create_stream","description":"Create a new research stream (external profile, company, topic, person interests, hiring signals, or ad watch). Running the stream on its schedule costs credits"},{"name":"list_streams","description":"List all research streams for the authenticated user (external profiles, companies, topics, person interests, hiring signals, ad watches, and own_profile). Pass"},{"name":"get_stream_feed","description":"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_"},{"name":"pause_stream","description":"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 billin"},{"name":"resume_stream","description":"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 "},{"name":"delete_stream","description":"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"},{"name":"run_stream_now","description":"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 happen"},{"name":"linkedin_profile_info","description":"Fetch a LinkedIn person profile (headline, current role, work history, education, location). Costs 5 credits per call. Results are upserted into `people` (struc"},{"name":"linkedin_profile_posts","description":"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"},{"name":"linkedin_company_posts","description":"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 p"},{"name":"linkedin_post_search","description":"Search LinkedIn posts by keyword. Costs 5 credits per call. Returns a single page of matching posts."},{"name":"linkedin_profile_reactions","description":"Fetch the recent posts a LinkedIn person has reacted to. Useful for inferring interests. Costs 5 credits per call."},{"name":"linkedin_profile_comments","description":"Fetch the recent posts a LinkedIn person has commented on. Useful for inferring interests and conversation partners. Costs 5 credits per call."},{"name":"linkedin_job_search","description":"Search LinkedIn job postings. Useful for tracking hiring signals at target companies. Costs 5 credits per call."},{"name":"linkedin_ad_search","description":"Search the LinkedIn ad library. Useful for tracking competitor ad creative and messaging. Costs 10 credits per call."},{"name":"linkedin_people_search","description":"Search LinkedIn people. Filter by company, title, location, or free-text keywords. Costs 5 credits per call. Returns a single page of matching profiles."},{"name":"linkedin_company_search","description":"Search LinkedIn companies. Filter by keywords, industryId, or location. Costs 5 credits per call. Returns a single page of matching companies."},{"name":"linkedin_post_reactions","description":"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 s"},{"name":"linkedin_post_comments","description":"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 "},{"name":"find_similar_posts","description":"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 "},{"name":"score_draft","description":"Predict how a draft post will perform against the user's historical data. Uses an OLS regression model with detrending, ridge regularization, and recency weight"},{"name":"suggest_angles","description":"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 ca"},{"name":"list_segments","description":"List all audience segments for the authenticated user, with member counts. Audience segments are named groups of people (e.g. 'ICP — VPs of Marketing', 'Champio"},{"name":"create_segment","description":"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),"},{"name":"add_to_segment","description":"Add one or more people (by person_id) to an audience segment. Existing members are silently ignored. Free — costs 0 credits."},{"name":"remove_from_segment","description":"Remove one or more people (by person_id) from an audience segment. Missing members are silently ignored. Free — costs 0 credits."},{"name":"resolve_segment","description":"Resolve an audience segment into a concrete list of person_ids. For manual / auto_stream segments, returns stored members. For smart segments, evaluates the seg"},{"name":"list_segment_templates","description":"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 "},{"name":"get_alerts","description":"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 sk"},{"name":"create_collection","description":"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` predicat"},{"name":"add_to_collection","description":"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 "},{"name":"remove_from_collection","description":"Remove one or more posts (by post_id) from a collection. Missing members are silently ignored. Free — costs 0 credits."},{"name":"list_collections","description":"List all post collections for the authenticated user, with member counts. Includes manual collections, smart collections (predicate-based), and auto_stream coll"},{"name":"resolve_collection","description":"Resolve a post collection into a concrete list of post_ids. For manual / auto_stream collections, returns stored members. For smart collections, evaluates the c"},{"name":"create_campaign","description":"Create a Constellation outreach campaign. A campaign groups target accounts, the people you care about at those accounts, and the warm connections you could app"},{"name":"add_campaign_accounts","description":"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 — cos"},{"name":"map_constellation","description":"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"},{"name":"score_connections","description":"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"},{"name":"get_outreach_queue","description":"Return a prioritized outreach queue. Provide *exactly one* of three scopes:\n• `campaign_id` — full Constellation queue with composite_score, pool, recommended_a"},{"name":"get_engagement_brief","description":"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 "},{"name":"log_outcome","description":"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"},{"name":"get_campaign_stats","description":"Summary stats for a Constellation campaign: target count, entry count, outreach volume, and acceptance / reply rates broken down by pool (coworker / engager / m"},{"name":"save_post","description":"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 "},{"name":"get_post_engagers_by_company","description":"Given a LinkedIn post URL or id, return the companies whose people engaged (reacted/commented), ranked by engager count. Joins through person_positions(is_curre"},{"name":"get_engagement_industry_breakdown","description":"Histogram of engagers' companies grouped by industry. Pivots on companies.industry_hierarchy (e.g. 'Tech > Software Development'). Depth=1 buckets by top-level,"},{"name":"get_alumni_engagers","description":"Given a company URL or id, return engagers (across your collected posts) who have a position at that company. Relation filter: 'coworker' = current employees, '"},{"name":"get_engager_position_history","description":"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 c"},{"name":"get_target_warmth_brief","description":"For a target person, summarize all engagement evidence between them and your collected posts: posts they reacted to, posts they commented on, frequency, recency"},{"name":"traverse_graph_help","description":"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 re"},{"name":"traverse_graph","description":"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 + ca"},{"name":"get_company_engagement_overlap","description":"Given two companies, return engagers across your collected posts who engaged with BOTH companies' posts. Cross-account intelligence — finds people interested in"},{"name":"get_outreach_path","description":"Given a target person, find the shortest warm-intro path through your engager network. Walks coworker (shared current company) + alumni (shared past company / s"},{"name":"get_post_set_engagers","description":"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 (collectio"}],"toolCount":67,"toolsHash":"6350188bf28c4599c92dce7da3def0364d397cde8b62db6fa7979478edf87450","serverName":"flux","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-06T08:27:03.044Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":172,"error":null,"detail":{"tools":[{"name":"list_profiles","description":"List all tracked LinkedIn profiles for the authenticated user. Returns profile IDs needed by other tools."},{"name":"preview_profile","description":"Analyze a public LinkedIn profile or company page without a Flux account: pulls the latest ~50 posts (once per profile) and returns a teaser: post count, averag"},{"name":"preview_posting_insights","description":"Full breakdown for a previewed profile (from preview_profile): best day, hour, format and length, the top and bottom 5 posts with measured reasons, and engageme"},{"name":"preview_search_posts","description":"Keyword search over the latest 50 posts of a previewed profile (from preview_profile). Case-insensitive substring match; returns matching posts ordered by engag"},{"name":"claim_preview","description":"Make a profile from preview_profile your own Flux dashboard. Call this only when the person says the profile is theirs: the person cannot undo a claim. Requires"},{"name":"get_posts","description":"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 alr"},{"name":"get_profile_summary","description":"Get KPI summary for a tracked profile: total posts, average engagement (broken down by likes/comments/shares/conversation rate), posts per week, engagement tren"},{"name":"get_posting_insights","description":"Get optimal posting patterns for a profile: best day of week, best hour, format performance breakdown, and character length sweet spot. Includes full metric bre"},{"name":"get_topic_insights","description":"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"},{"name":"get_engagement_trends","description":"Get engagement time series for a profile with gap-filled buckets, rolling averages, and trend direction. Each bucket includes avg engagement, likes, comments, s"},{"name":"search_posts","description":"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 "},{"name":"get_credit_balance","description":"Return the authenticated user's current credit balance, this period's monthly allocation, and credits used since the period started. Free."},{"name":"get_usage_history","description":"Return recent credit_ledger transactions for the authenticated user. Filter by tool name, reason, or date range. Paginated. Free."},{"name":"get_cost_estimate","description":"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, per"},{"name":"create_stream","description":"Create a new research stream (external profile, company, topic, person interests, hiring signals, or ad watch). Running the stream on its schedule costs credits"},{"name":"list_streams","description":"List all research streams for the authenticated user (external profiles, companies, topics, person interests, hiring signals, ad watches, and own_profile). Pass"},{"name":"get_stream_feed","description":"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_"},{"name":"pause_stream","description":"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 billin"},{"name":"resume_stream","description":"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 "},{"name":"delete_stream","description":"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"},{"name":"run_stream_now","description":"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 happen"},{"name":"linkedin_profile_info","description":"Fetch a LinkedIn person profile (headline, current role, work history, education, location). Costs 5 credits per call. Results are upserted into `people` (struc"},{"name":"linkedin_profile_posts","description":"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"},{"name":"linkedin_company_posts","description":"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 p"},{"name":"linkedin_post_search","description":"Search LinkedIn posts by keyword. Costs 5 credits per call. Returns a single page of matching posts."},{"name":"linkedin_profile_reactions","description":"Fetch the recent posts a LinkedIn person has reacted to. Useful for inferring interests. Costs 5 credits per call."},{"name":"linkedin_profile_comments","description":"Fetch the recent posts a LinkedIn person has commented on. Useful for inferring interests and conversation partners. Costs 5 credits per call."},{"name":"linkedin_job_search","description":"Search LinkedIn job postings. Useful for tracking hiring signals at target companies. Costs 5 credits per call."},{"name":"linkedin_ad_search","description":"Search the LinkedIn ad library. Useful for tracking competitor ad creative and messaging. Costs 10 credits per call."},{"name":"linkedin_people_search","description":"Search LinkedIn people. Filter by company, title, location, or free-text keywords. Costs 5 credits per call. Returns a single page of matching profiles."},{"name":"linkedin_company_search","description":"Search LinkedIn companies. Filter by keywords, industryId, or location. Costs 5 credits per call. Returns a single page of matching companies."},{"name":"linkedin_post_reactions","description":"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 s"},{"name":"linkedin_post_comments","description":"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 "},{"name":"find_similar_posts","description":"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 "},{"name":"score_draft","description":"Predict how a draft post will perform against the user's historical data. Uses an OLS regression model with detrending, ridge regularization, and recency weight"},{"name":"suggest_angles","description":"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 ca"},{"name":"list_segments","description":"List all audience segments for the authenticated user, with member counts. Audience segments are named groups of people (e.g. 'ICP — VPs of Marketing', 'Champio"},{"name":"create_segment","description":"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),"},{"name":"add_to_segment","description":"Add one or more people (by person_id) to an audience segment. Existing members are silently ignored. Free — costs 0 credits."},{"name":"remove_from_segment","description":"Remove one or more people (by person_id) from an audience segment. Missing members are silently ignored. Free — costs 0 credits."},{"name":"resolve_segment","description":"Resolve an audience segment into a concrete list of person_ids. For manual / auto_stream segments, returns stored members. For smart segments, evaluates the seg"},{"name":"list_segment_templates","description":"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 "},{"name":"get_alerts","description":"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 sk"},{"name":"create_collection","description":"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` predicat"},{"name":"add_to_collection","description":"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 "},{"name":"remove_from_collection","description":"Remove one or more posts (by post_id) from a collection. Missing members are silently ignored. Free — costs 0 credits."},{"name":"list_collections","description":"List all post collections for the authenticated user, with member counts. Includes manual collections, smart collections (predicate-based), and auto_stream coll"},{"name":"resolve_collection","description":"Resolve a post collection into a concrete list of post_ids. For manual / auto_stream collections, returns stored members. For smart collections, evaluates the c"},{"name":"create_campaign","description":"Create a Constellation outreach campaign. A campaign groups target accounts, the people you care about at those accounts, and the warm connections you could app"},{"name":"add_campaign_accounts","description":"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 — cos"},{"name":"map_constellation","description":"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"},{"name":"score_connections","description":"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"},{"name":"get_outreach_queue","description":"Return a prioritized outreach queue. Provide *exactly one* of three scopes:\n• `campaign_id` — full Constellation queue with composite_score, pool, recommended_a"},{"name":"get_engagement_brief","description":"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 "},{"name":"log_outcome","description":"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"},{"name":"get_campaign_stats","description":"Summary stats for a Constellation campaign: target count, entry count, outreach volume, and acceptance / reply rates broken down by pool (coworker / engager / m"},{"name":"save_post","description":"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 "},{"name":"get_post_engagers_by_company","description":"Given a LinkedIn post URL or id, return the companies whose people engaged (reacted/commented), ranked by engager count. Joins through person_positions(is_curre"},{"name":"get_engagement_industry_breakdown","description":"Histogram of engagers' companies grouped by industry. Pivots on companies.industry_hierarchy (e.g. 'Tech > Software Development'). Depth=1 buckets by top-level,"},{"name":"get_alumni_engagers","description":"Given a company URL or id, return engagers (across your collected posts) who have a position at that company. Relation filter: 'coworker' = current employees, '"},{"name":"get_engager_position_history","description":"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 c"},{"name":"get_target_warmth_brief","description":"For a target person, summarize all engagement evidence between them and your collected posts: posts they reacted to, posts they commented on, frequency, recency"},{"name":"traverse_graph_help","description":"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 re"},{"name":"traverse_graph","description":"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 + ca"},{"name":"get_company_engagement_overlap","description":"Given two companies, return engagers across your collected posts who engaged with BOTH companies' posts. Cross-account intelligence — finds people interested in"},{"name":"get_outreach_path","description":"Given a target person, find the shortest warm-intro path through your engager network. Walks coworker (shared current company) + alumni (shared past company / s"},{"name":"get_post_set_engagers","description":"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 (collectio"}],"toolCount":67,"toolsHash":"6350188bf28c4599c92dce7da3def0364d397cde8b62db6fa7979478edf87450","serverName":"flux","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-06T00:24:57.846Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":176,"error":null,"detail":{"tools":[{"name":"list_profiles","description":"List all tracked LinkedIn profiles for the authenticated user. Returns profile IDs needed by other tools."},{"name":"preview_profile","description":"Analyze a public LinkedIn profile or company page without a Flux account: pulls the latest ~50 posts (once per profile) and returns a teaser: post count, averag"},{"name":"preview_posting_insights","description":"Full breakdown for a previewed profile (from preview_profile): best day, hour, format and length, the top and bottom 5 posts with measured reasons, and engageme"},{"name":"preview_search_posts","description":"Keyword search over the latest 50 posts of a previewed profile (from preview_profile). Case-insensitive substring match; returns matching posts ordered by engag"},{"name":"claim_preview","description":"Make a profile from preview_profile your own Flux dashboard. Call this only when the person says the profile is theirs: the person cannot undo a claim. Requires"},{"name":"get_posts","description":"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 alr"},{"name":"get_profile_summary","description":"Get KPI summary for a tracked profile: total posts, average engagement (broken down by likes/comments/shares/conversation rate), posts per week, engagement tren"},{"name":"get_posting_insights","description":"Get optimal posting patterns for a profile: best day of week, best hour, format performance breakdown, and character length sweet spot. Includes full metric bre"},{"name":"get_topic_insights","description":"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"},{"name":"get_engagement_trends","description":"Get engagement time series for a profile with gap-filled buckets, rolling averages, and trend direction. Each bucket includes avg engagement, likes, comments, s"},{"name":"search_posts","description":"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 "},{"name":"get_credit_balance","description":"Return the authenticated user's current credit balance, this period's monthly allocation, and credits used since the period started. Free."},{"name":"get_usage_history","description":"Return recent credit_ledger transactions for the authenticated user. Filter by tool name, reason, or date range. Paginated. Free."},{"name":"get_cost_estimate","description":"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, per"},{"name":"create_stream","description":"Create a new research stream (external profile, company, topic, person interests, hiring signals, or ad watch). Running the stream on its schedule costs credits"},{"name":"list_streams","description":"List all research streams for the authenticated user (external profiles, companies, topics, person interests, hiring signals, ad watches, and own_profile). Pass"},{"name":"get_stream_feed","description":"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_"},{"name":"pause_stream","description":"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 billin"},{"name":"resume_stream","description":"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 "},{"name":"delete_stream","description":"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"},{"name":"run_stream_now","description":"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 happen"},{"name":"linkedin_profile_info","description":"Fetch a LinkedIn person profile (headline, current role, work history, education, location). Costs 5 credits per call. Results are upserted into `people` (struc"},{"name":"linkedin_profile_posts","description":"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"},{"name":"linkedin_company_posts","description":"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 p"},{"name":"linkedin_post_search","description":"Search LinkedIn posts by keyword. Costs 5 credits per call. Returns a single page of matching posts."},{"name":"linkedin_profile_reactions","description":"Fetch the recent posts a LinkedIn person has reacted to. Useful for inferring interests. Costs 5 credits per call."},{"name":"linkedin_profile_comments","description":"Fetch the recent posts a LinkedIn person has commented on. Useful for inferring interests and conversation partners. Costs 5 credits per call."},{"name":"linkedin_job_search","description":"Search LinkedIn job postings. Useful for tracking hiring signals at target companies. Costs 5 credits per call."},{"name":"linkedin_ad_search","description":"Search the LinkedIn ad library. Useful for tracking competitor ad creative and messaging. Costs 10 credits per call."},{"name":"linkedin_people_search","description":"Search LinkedIn people. Filter by company, title, location, or free-text keywords. Costs 5 credits per call. Returns a single page of matching profiles."},{"name":"linkedin_company_search","description":"Search LinkedIn companies. Filter by keywords, industryId, or location. Costs 5 credits per call. Returns a single page of matching companies."},{"name":"linkedin_post_reactions","description":"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 s"},{"name":"linkedin_post_comments","description":"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 "},{"name":"find_similar_posts","description":"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 "},{"name":"score_draft","description":"Predict how a draft post will perform against the user's historical data. Uses an OLS regression model with detrending, ridge regularization, and recency weight"},{"name":"suggest_angles","description":"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 ca"},{"name":"list_segments","description":"List all audience segments for the authenticated user, with member counts. Audience segments are named groups of people (e.g. 'ICP — VPs of Marketing', 'Champio"},{"name":"create_segment","description":"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),"},{"name":"add_to_segment","description":"Add one or more people (by person_id) to an audience segment. Existing members are silently ignored. Free — costs 0 credits."},{"name":"remove_from_segment","description":"Remove one or more people (by person_id) from an audience segment. Missing members are silently ignored. Free — costs 0 credits."},{"name":"resolve_segment","description":"Resolve an audience segment into a concrete list of person_ids. For manual / auto_stream segments, returns stored members. For smart segments, evaluates the seg"},{"name":"list_segment_templates","description":"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 "},{"name":"get_alerts","description":"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 sk"},{"name":"create_collection","description":"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` predicat"},{"name":"add_to_collection","description":"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 "},{"name":"remove_from_collection","description":"Remove one or more posts (by post_id) from a collection. Missing members are silently ignored. Free — costs 0 credits."},{"name":"list_collections","description":"List all post collections for the authenticated user, with member counts. Includes manual collections, smart collections (predicate-based), and auto_stream coll"},{"name":"resolve_collection","description":"Resolve a post collection into a concrete list of post_ids. For manual / auto_stream collections, returns stored members. For smart collections, evaluates the c"},{"name":"create_campaign","description":"Create a Constellation outreach campaign. A campaign groups target accounts, the people you care about at those accounts, and the warm connections you could app"},{"name":"add_campaign_accounts","description":"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 — cos"},{"name":"map_constellation","description":"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"},{"name":"score_connections","description":"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"},{"name":"get_outreach_queue","description":"Return a prioritized outreach queue. Provide *exactly one* of three scopes:\n• `campaign_id` — full Constellation queue with composite_score, pool, recommended_a"},{"name":"get_engagement_brief","description":"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 "},{"name":"log_outcome","description":"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"},{"name":"get_campaign_stats","description":"Summary stats for a Constellation campaign: target count, entry count, outreach volume, and acceptance / reply rates broken down by pool (coworker / engager / m"},{"name":"save_post","description":"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 "},{"name":"get_post_engagers_by_company","description":"Given a LinkedIn post URL or id, return the companies whose people engaged (reacted/commented), ranked by engager count. Joins through person_positions(is_curre"},{"name":"get_engagement_industry_breakdown","description":"Histogram of engagers' companies grouped by industry. Pivots on companies.industry_hierarchy (e.g. 'Tech > Software Development'). Depth=1 buckets by top-level,"},{"name":"get_alumni_engagers","description":"Given a company URL or id, return engagers (across your collected posts) who have a position at that company. Relation filter: 'coworker' = current employees, '"},{"name":"get_engager_position_history","description":"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 c"},{"name":"get_target_warmth_brief","description":"For a target person, summarize all engagement evidence between them and your collected posts: posts they reacted to, posts they commented on, frequency, recency"},{"name":"traverse_graph_help","description":"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 re"},{"name":"traverse_graph","description":"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 + ca"},{"name":"get_company_engagement_overlap","description":"Given two companies, return engagers across your collected posts who engaged with BOTH companies' posts. Cross-account intelligence — finds people interested in"},{"name":"get_outreach_path","description":"Given a target person, find the shortest warm-intro path through your engager network. Walks coworker (shared current company) + alumni (shared past company / s"},{"name":"get_post_set_engagers","description":"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 (collectio"}],"toolCount":67,"toolsHash":"6350188bf28c4599c92dce7da3def0364d397cde8b62db6fa7979478edf87450","serverName":"flux","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-05T15:22:49.301Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":124,"error":null,"detail":{"tools":[{"name":"list_profiles","description":"List all tracked LinkedIn profiles for the authenticated user. Returns profile IDs needed by other tools."},{"name":"preview_profile","description":"Analyze a public LinkedIn profile or company page without a Flux account: pulls the latest ~50 posts (once per profile) and returns a teaser: post count, averag"},{"name":"preview_posting_insights","description":"Full breakdown for a previewed profile (from preview_profile): best day, hour, format and length, the top and bottom 5 posts with measured reasons, and engageme"},{"name":"preview_search_posts","description":"Keyword search over the latest 50 posts of a previewed profile (from preview_profile). Case-insensitive substring match; returns matching posts ordered by engag"},{"name":"claim_preview","description":"Make a profile from preview_profile your own Flux dashboard. Call this only when the person says the profile is theirs: the person cannot undo a claim. Requires"},{"name":"get_posts","description":"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 alr"},{"name":"get_profile_summary","description":"Get KPI summary for a tracked profile: total posts, average engagement (broken down by likes/comments/shares/conversation rate), posts per week, engagement tren"},{"name":"get_posting_insights","description":"Get optimal posting patterns for a profile: best day of week, best hour, format performance breakdown, and character length sweet spot. Includes full metric bre"},{"name":"get_topic_insights","description":"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"},{"name":"get_engagement_trends","description":"Get engagement time series for a profile with gap-filled buckets, rolling averages, and trend direction. Each bucket includes avg engagement, likes, comments, s"},{"name":"search_posts","description":"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 "},{"name":"get_credit_balance","description":"Return the authenticated user's current credit balance, this period's monthly allocation, and credits used since the period started. Free."},{"name":"get_usage_history","description":"Return recent credit_ledger transactions for the authenticated user. Filter by tool name, reason, or date range. Paginated. Free."},{"name":"get_cost_estimate","description":"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, per"},{"name":"create_stream","description":"Create a new research stream (external profile, company, topic, person interests, hiring signals, or ad watch). Running the stream on its schedule costs credits"},{"name":"list_streams","description":"List all research streams for the authenticated user (external profiles, companies, topics, person interests, hiring signals, ad watches, and own_profile). Pass"},{"name":"get_stream_feed","description":"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_"},{"name":"pause_stream","description":"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 billin"},{"name":"resume_stream","description":"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 "},{"name":"delete_stream","description":"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"},{"name":"run_stream_now","description":"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 happen"},{"name":"linkedin_profile_info","description":"Fetch a LinkedIn person profile (headline, current role, work history, education, location). Costs 5 credits per call. Results are upserted into `people` (struc"},{"name":"linkedin_profile_posts","description":"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"},{"name":"linkedin_company_posts","description":"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 p"},{"name":"linkedin_post_search","description":"Search LinkedIn posts by keyword. Costs 5 credits per call. Returns a single page of matching posts."},{"name":"linkedin_profile_reactions","description":"Fetch the recent posts a LinkedIn person has reacted to. Useful for inferring interests. Costs 5 credits per call."},{"name":"linkedin_profile_comments","description":"Fetch the recent posts a LinkedIn person has commented on. Useful for inferring interests and conversation partners. Costs 5 credits per call."},{"name":"linkedin_job_search","description":"Search LinkedIn job postings. Useful for tracking hiring signals at target companies. Costs 5 credits per call."},{"name":"linkedin_ad_search","description":"Search the LinkedIn ad library. Useful for tracking competitor ad creative and messaging. Costs 10 credits per call."},{"name":"linkedin_people_search","description":"Search LinkedIn people. Filter by company, title, location, or free-text keywords. Costs 5 credits per call. Returns a single page of matching profiles."},{"name":"linkedin_company_search","description":"Search LinkedIn companies. Filter by keywords, industryId, or location. Costs 5 credits per call. Returns a single page of matching companies."},{"name":"linkedin_post_reactions","description":"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 s"},{"name":"linkedin_post_comments","description":"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 "},{"name":"find_similar_posts","description":"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 "},{"name":"score_draft","description":"Predict how a draft post will perform against the user's historical data. Uses an OLS regression model with detrending, ridge regularization, and recency weight"},{"name":"suggest_angles","description":"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 ca"},{"name":"list_segments","description":"List all audience segments for the authenticated user, with member counts. Audience segments are named groups of people (e.g. 'ICP — VPs of Marketing', 'Champio"},{"name":"create_segment","description":"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),"},{"name":"add_to_segment","description":"Add one or more people (by person_id) to an audience segment. Existing members are silently ignored. Free — costs 0 credits."},{"name":"remove_from_segment","description":"Remove one or more people (by person_id) from an audience segment. Missing members are silently ignored. Free — costs 0 credits."},{"name":"resolve_segment","description":"Resolve an audience segment into a concrete list of person_ids. For manual / auto_stream segments, returns stored members. For smart segments, evaluates the seg"},{"name":"list_segment_templates","description":"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 "},{"name":"get_alerts","description":"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 sk"},{"name":"create_collection","description":"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` predicat"},{"name":"add_to_collection","description":"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 "},{"name":"remove_from_collection","description":"Remove one or more posts (by post_id) from a collection. Missing members are silently ignored. Free — costs 0 credits."},{"name":"list_collections","description":"List all post collections for the authenticated user, with member counts. Includes manual collections, smart collections (predicate-based), and auto_stream coll"},{"name":"resolve_collection","description":"Resolve a post collection into a concrete list of post_ids. For manual / auto_stream collections, returns stored members. For smart collections, evaluates the c"},{"name":"create_campaign","description":"Create a Constellation outreach campaign. A campaign groups target accounts, the people you care about at those accounts, and the warm connections you could app"},{"name":"add_campaign_accounts","description":"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 — cos"},{"name":"map_constellation","description":"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"},{"name":"score_connections","description":"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"},{"name":"get_outreach_queue","description":"Return a prioritized outreach queue. Provide *exactly one* of three scopes:\n• `campaign_id` — full Constellation queue with composite_score, pool, recommended_a"},{"name":"get_engagement_brief","description":"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 "},{"name":"log_outcome","description":"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"},{"name":"get_campaign_stats","description":"Summary stats for a Constellation campaign: target count, entry count, outreach volume, and acceptance / reply rates broken down by pool (coworker / engager / m"},{"name":"save_post","description":"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 "},{"name":"get_post_engagers_by_company","description":"Given a LinkedIn post URL or id, return the companies whose people engaged (reacted/commented), ranked by engager count. Joins through person_positions(is_curre"},{"name":"get_engagement_industry_breakdown","description":"Histogram of engagers' companies grouped by industry. Pivots on companies.industry_hierarchy (e.g. 'Tech > Software Development'). Depth=1 buckets by top-level,"},{"name":"get_alumni_engagers","description":"Given a company URL or id, return engagers (across your collected posts) who have a position at that company. Relation filter: 'coworker' = current employees, '"},{"name":"get_engager_position_history","description":"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 c"},{"name":"get_target_warmth_brief","description":"For a target person, summarize all engagement evidence between them and your collected posts: posts they reacted to, posts they commented on, frequency, recency"},{"name":"traverse_graph_help","description":"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 re"},{"name":"traverse_graph","description":"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 + ca"},{"name":"get_company_engagement_overlap","description":"Given two companies, return engagers across your collected posts who engaged with BOTH companies' posts. Cross-account intelligence — finds people interested in"},{"name":"get_outreach_path","description":"Given a target person, find the shortest warm-intro path through your engager network. Walks coworker (shared current company) + alumni (shared past company / s"},{"name":"get_post_set_engagers","description":"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 (collectio"}],"toolCount":67,"toolsHash":"6350188bf28c4599c92dce7da3def0364d397cde8b62db6fa7979478edf87450","serverName":"flux","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-05T06:27:24.626Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":215,"error":null,"detail":{"tools":[{"name":"list_profiles","description":"List all tracked LinkedIn profiles for the authenticated user. Returns profile IDs needed by other tools."},{"name":"preview_profile","description":"Analyze a public LinkedIn profile or company page without a Flux account: pulls the latest ~50 posts (once per profile) and returns a teaser: post count, averag"},{"name":"preview_posting_insights","description":"Full breakdown for a previewed profile (from preview_profile): best day, hour, format and length, the top and bottom 5 posts with measured reasons, and engageme"},{"name":"preview_search_posts","description":"Keyword search over the latest 50 posts of a previewed profile (from preview_profile). Case-insensitive substring match; returns matching posts ordered by engag"},{"name":"claim_preview","description":"Make a profile from preview_profile your own Flux dashboard. Call this only when the person says the profile is theirs: the person cannot undo a claim. Requires"},{"name":"get_posts","description":"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 alr"},{"name":"get_profile_summary","description":"Get KPI summary for a tracked profile: total posts, average engagement (broken down by likes/comments/shares/conversation rate), posts per week, engagement tren"},{"name":"get_posting_insights","description":"Get optimal posting patterns for a profile: best day of week, best hour, format performance breakdown, and character length sweet spot. Includes full metric bre"},{"name":"get_topic_insights","description":"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"},{"name":"get_engagement_trends","description":"Get engagement time series for a profile with gap-filled buckets, rolling averages, and trend direction. Each bucket includes avg engagement, likes, comments, s"},{"name":"search_posts","description":"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 "},{"name":"get_credit_balance","description":"Return the authenticated user's current credit balance, this period's monthly allocation, and credits used since the period started. Free."},{"name":"get_usage_history","description":"Return recent credit_ledger transactions for the authenticated user. Filter by tool name, reason, or date range. Paginated. Free."},{"name":"get_cost_estimate","description":"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, per"},{"name":"create_stream","description":"Create a new research stream (external profile, company, topic, person interests, hiring signals, or ad watch). Running the stream on its schedule costs credits"},{"name":"list_streams","description":"List all research streams for the authenticated user (external profiles, companies, topics, person interests, hiring signals, ad watches, and own_profile). Pass"},{"name":"get_stream_feed","description":"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_"},{"name":"pause_stream","description":"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 billin"},{"name":"resume_stream","description":"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 "},{"name":"delete_stream","description":"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"},{"name":"run_stream_now","description":"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 happen"},{"name":"linkedin_profile_info","description":"Fetch a LinkedIn person profile (headline, current role, work history, education, location). Costs 5 credits per call. Results are upserted into `people` (struc"},{"name":"linkedin_profile_posts","description":"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"},{"name":"linkedin_company_posts","description":"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 p"},{"name":"linkedin_post_search","description":"Search LinkedIn posts by keyword. Costs 5 credits per call. Returns a single page of matching posts."},{"name":"linkedin_profile_reactions","description":"Fetch the recent posts a LinkedIn person has reacted to. Useful for inferring interests. Costs 5 credits per call."},{"name":"linkedin_profile_comments","description":"Fetch the recent posts a LinkedIn person has commented on. Useful for inferring interests and conversation partners. Costs 5 credits per call."},{"name":"linkedin_job_search","description":"Search LinkedIn job postings. Useful for tracking hiring signals at target companies. Costs 5 credits per call."},{"name":"linkedin_ad_search","description":"Search the LinkedIn ad library. Useful for tracking competitor ad creative and messaging. Costs 10 credits per call."},{"name":"linkedin_people_search","description":"Search LinkedIn people. Filter by company, title, location, or free-text keywords. Costs 5 credits per call. Returns a single page of matching profiles."},{"name":"linkedin_company_search","description":"Search LinkedIn companies. Filter by keywords, industryId, or location. Costs 5 credits per call. Returns a single page of matching companies."},{"name":"linkedin_post_reactions","description":"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 s"},{"name":"linkedin_post_comments","description":"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 "},{"name":"find_similar_posts","description":"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 "},{"name":"score_draft","description":"Predict how a draft post will perform against the user's historical data. Uses an OLS regression model with detrending, ridge regularization, and recency weight"},{"name":"suggest_angles","description":"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 ca"},{"name":"list_segments","description":"List all audience segments for the authenticated user, with member counts. Audience segments are named groups of people (e.g. 'ICP — VPs of Marketing', 'Champio"},{"name":"create_segment","description":"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),"},{"name":"add_to_segment","description":"Add one or more people (by person_id) to an audience segment. Existing members are silently ignored. Free — costs 0 credits."},{"name":"remove_from_segment","description":"Remove one or more people (by person_id) from an audience segment. Missing members are silently ignored. Free — costs 0 credits."},{"name":"resolve_segment","description":"Resolve an audience segment into a concrete list of person_ids. For manual / auto_stream segments, returns stored members. For smart segments, evaluates the seg"},{"name":"list_segment_templates","description":"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 "},{"name":"get_alerts","description":"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 sk"},{"name":"create_collection","description":"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` predicat"},{"name":"add_to_collection","description":"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 "},{"name":"remove_from_collection","description":"Remove one or more posts (by post_id) from a collection. Missing members are silently ignored. Free — costs 0 credits."},{"name":"list_collections","description":"List all post collections for the authenticated user, with member counts. Includes manual collections, smart collections (predicate-based), and auto_stream coll"},{"name":"resolve_collection","description":"Resolve a post collection into a concrete list of post_ids. For manual / auto_stream collections, returns stored members. For smart collections, evaluates the c"},{"name":"create_campaign","description":"Create a Constellation outreach campaign. A campaign groups target accounts, the people you care about at those accounts, and the warm connections you could app"},{"name":"add_campaign_accounts","description":"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 — cos"},{"name":"map_constellation","description":"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"},{"name":"score_connections","description":"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"},{"name":"get_outreach_queue","description":"Return a prioritized outreach queue. Provide *exactly one* of three scopes:\n• `campaign_id` — full Constellation queue with composite_score, pool, recommended_a"},{"name":"get_engagement_brief","description":"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 "},{"name":"log_outcome","description":"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"},{"name":"get_campaign_stats","description":"Summary stats for a Constellation campaign: target count, entry count, outreach volume, and acceptance / reply rates broken down by pool (coworker / engager / m"},{"name":"save_post","description":"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 "},{"name":"get_post_engagers_by_company","description":"Given a LinkedIn post URL or id, return the companies whose people engaged (reacted/commented), ranked by engager count. Joins through person_positions(is_curre"},{"name":"get_engagement_industry_breakdown","description":"Histogram of engagers' companies grouped by industry. Pivots on companies.industry_hierarchy (e.g. 'Tech > Software Development'). Depth=1 buckets by top-level,"},{"name":"get_alumni_engagers","description":"Given a company URL or id, return engagers (across your collected posts) who have a position at that company. Relation filter: 'coworker' = current employees, '"},{"name":"get_engager_position_history","description":"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 c"},{"name":"get_target_warmth_brief","description":"For a target person, summarize all engagement evidence between them and your collected posts: posts they reacted to, posts they commented on, frequency, recency"},{"name":"traverse_graph_help","description":"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 re"},{"name":"traverse_graph","description":"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 + ca"},{"name":"get_company_engagement_overlap","description":"Given two companies, return engagers across your collected posts who engaged with BOTH companies' posts. Cross-account intelligence — finds people interested in"},{"name":"get_outreach_path","description":"Given a target person, find the shortest warm-intro path through your engager network. Walks coworker (shared current company) + alumni (shared past company / s"},{"name":"get_post_set_engagers","description":"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 (collectio"}],"toolCount":67,"toolsHash":"6350188bf28c4599c92dce7da3def0364d397cde8b62db6fa7979478edf87450","serverName":"flux","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-04T22:24:14.317Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":321,"error":null,"detail":{"tools":[{"name":"list_profiles","description":"List all tracked LinkedIn profiles for the authenticated user. Returns profile IDs needed by other tools."},{"name":"preview_profile","description":"Analyze a public LinkedIn profile or company page without a Flux account: pulls the latest ~50 posts (once per profile) and returns a teaser: post count, averag"},{"name":"preview_posting_insights","description":"Full breakdown for a previewed profile (from preview_profile): best day, hour, format and length, the top and bottom 5 posts with measured reasons, and engageme"},{"name":"preview_search_posts","description":"Keyword search over the latest 50 posts of a previewed profile (from preview_profile). Case-insensitive substring match; returns matching posts ordered by engag"},{"name":"claim_preview","description":"Make a profile from preview_profile your own Flux dashboard. Call this only when the person says the profile is theirs: the person cannot undo a claim. Requires"},{"name":"get_posts","description":"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 alr"},{"name":"get_profile_summary","description":"Get KPI summary for a tracked profile: total posts, average engagement (broken down by likes/comments/shares/conversation rate), posts per week, engagement tren"},{"name":"get_posting_insights","description":"Get optimal posting patterns for a profile: best day of week, best hour, format performance breakdown, and character length sweet spot. Includes full metric bre"},{"name":"get_topic_insights","description":"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"},{"name":"get_engagement_trends","description":"Get engagement time series for a profile with gap-filled buckets, rolling averages, and trend direction. Each bucket includes avg engagement, likes, comments, s"},{"name":"search_posts","description":"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 "},{"name":"get_credit_balance","description":"Return the authenticated user's current credit balance, this period's monthly allocation, and credits used since the period started. Free."},{"name":"get_usage_history","description":"Return recent credit_ledger transactions for the authenticated user. Filter by tool name, reason, or date range. Paginated. Free."},{"name":"get_cost_estimate","description":"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, per"},{"name":"create_stream","description":"Create a new research stream (external profile, company, topic, person interests, hiring signals, or ad watch). Running the stream on its schedule costs credits"},{"name":"list_streams","description":"List all research streams for the authenticated user (external profiles, companies, topics, person interests, hiring signals, ad watches, and own_profile). Pass"},{"name":"get_stream_feed","description":"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_"},{"name":"pause_stream","description":"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 billin"},{"name":"resume_stream","description":"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 "},{"name":"delete_stream","description":"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"},{"name":"run_stream_now","description":"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 happen"},{"name":"linkedin_profile_info","description":"Fetch a LinkedIn person profile (headline, current role, work history, education, location). Costs 5 credits per call. Results are upserted into `people` (struc"},{"name":"linkedin_profile_posts","description":"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"},{"name":"linkedin_company_posts","description":"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 p"},{"name":"linkedin_post_search","description":"Search LinkedIn posts by keyword. Costs 5 credits per call. Returns a single page of matching posts."},{"name":"linkedin_profile_reactions","description":"Fetch the recent posts a LinkedIn person has reacted to. Useful for inferring interests. Costs 5 credits per call."},{"name":"linkedin_profile_comments","description":"Fetch the recent posts a LinkedIn person has commented on. Useful for inferring interests and conversation partners. Costs 5 credits per call."},{"name":"linkedin_job_search","description":"Search LinkedIn job postings. Useful for tracking hiring signals at target companies. Costs 5 credits per call."},{"name":"linkedin_ad_search","description":"Search the LinkedIn ad library. Useful for tracking competitor ad creative and messaging. Costs 10 credits per call."},{"name":"linkedin_people_search","description":"Search LinkedIn people. Filter by company, title, location, or free-text keywords. Costs 5 credits per call. Returns a single page of matching profiles."},{"name":"linkedin_company_search","description":"Search LinkedIn companies. Filter by keywords, industryId, or location. Costs 5 credits per call. Returns a single page of matching companies."},{"name":"linkedin_post_reactions","description":"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 s"},{"name":"linkedin_post_comments","description":"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 "},{"name":"find_similar_posts","description":"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 "},{"name":"score_draft","description":"Predict how a draft post will perform against the user's historical data. Uses an OLS regression model with detrending, ridge regularization, and recency weight"},{"name":"suggest_angles","description":"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 ca"},{"name":"list_segments","description":"List all audience segments for the authenticated user, with member counts. Audience segments are named groups of people (e.g. 'ICP — VPs of Marketing', 'Champio"},{"name":"create_segment","description":"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),"},{"name":"add_to_segment","description":"Add one or more people (by person_id) to an audience segment. Existing members are silently ignored. Free — costs 0 credits."},{"name":"remove_from_segment","description":"Remove one or more people (by person_id) from an audience segment. Missing members are silently ignored. Free — costs 0 credits."},{"name":"resolve_segment","description":"Resolve an audience segment into a concrete list of person_ids. For manual / auto_stream segments, returns stored members. For smart segments, evaluates the seg"},{"name":"list_segment_templates","description":"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 "},{"name":"get_alerts","description":"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 sk"},{"name":"create_collection","description":"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` predicat"},{"name":"add_to_collection","description":"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 "},{"name":"remove_from_collection","description":"Remove one or more posts (by post_id) from a collection. Missing members are silently ignored. Free — costs 0 credits."},{"name":"list_collections","description":"List all post collections for the authenticated user, with member counts. Includes manual collections, smart collections (predicate-based), and auto_stream coll"},{"name":"resolve_collection","description":"Resolve a post collection into a concrete list of post_ids. For manual / auto_stream collections, returns stored members. For smart collections, evaluates the c"},{"name":"create_campaign","description":"Create a Constellation outreach campaign. A campaign groups target accounts, the people you care about at those accounts, and the warm connections you could app"},{"name":"add_campaign_accounts","description":"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 — cos"},{"name":"map_constellation","description":"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"},{"name":"score_connections","description":"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"},{"name":"get_outreach_queue","description":"Return a prioritized outreach queue. Provide *exactly one* of three scopes:\n• `campaign_id` — full Constellation queue with composite_score, pool, recommended_a"},{"name":"get_engagement_brief","description":"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 "},{"name":"log_outcome","description":"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"},{"name":"get_campaign_stats","description":"Summary stats for a Constellation campaign: target count, entry count, outreach volume, and acceptance / reply rates broken down by pool (coworker / engager / m"},{"name":"save_post","description":"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 "},{"name":"get_post_engagers_by_company","description":"Given a LinkedIn post URL or id, return the companies whose people engaged (reacted/commented), ranked by engager count. Joins through person_positions(is_curre"},{"name":"get_engagement_industry_breakdown","description":"Histogram of engagers' companies grouped by industry. Pivots on companies.industry_hierarchy (e.g. 'Tech > Software Development'). Depth=1 buckets by top-level,"},{"name":"get_alumni_engagers","description":"Given a company URL or id, return engagers (across your collected posts) who have a position at that company. Relation filter: 'coworker' = current employees, '"},{"name":"get_engager_position_history","description":"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 c"},{"name":"get_target_warmth_brief","description":"For a target person, summarize all engagement evidence between them and your collected posts: posts they reacted to, posts they commented on, frequency, recency"},{"name":"traverse_graph_help","description":"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 re"},{"name":"traverse_graph","description":"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 + ca"},{"name":"get_company_engagement_overlap","description":"Given two companies, return engagers across your collected posts who engaged with BOTH companies' posts. Cross-account intelligence — finds people interested in"},{"name":"get_outreach_path","description":"Given a target person, find the shortest warm-intro path through your engager network. Walks coworker (shared current company) + alumni (shared past company / s"},{"name":"get_post_set_engagers","description":"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 (collectio"}],"toolCount":67,"toolsHash":"6350188bf28c4599c92dce7da3def0364d397cde8b62db6fa7979478edf87450","serverName":"flux","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-04T14:22:59.344Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":195,"error":null,"detail":{"tools":[{"name":"list_profiles","description":"List all tracked LinkedIn profiles for the authenticated user. Returns profile IDs needed by other tools."},{"name":"preview_profile","description":"Analyze a public LinkedIn profile or company page without a Flux account: pulls the latest ~50 posts (once per profile) and returns a teaser: post count, averag"},{"name":"preview_posting_insights","description":"Full breakdown for a previewed profile (from preview_profile): best day, hour, format and length, the top and bottom 5 posts with measured reasons, and engageme"},{"name":"preview_search_posts","description":"Keyword search over the latest 50 posts of a previewed profile (from preview_profile). Case-insensitive substring match; returns matching posts ordered by engag"},{"name":"claim_preview","description":"Make a profile from preview_profile your own Flux dashboard. Call this only when the person says the profile is theirs: the person cannot undo a claim. Requires"},{"name":"get_posts","description":"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 alr"},{"name":"get_profile_summary","description":"Get KPI summary for a tracked profile: total posts, average engagement (broken down by likes/comments/shares/conversation rate), posts per week, engagement tren"},{"name":"get_posting_insights","description":"Get optimal posting patterns for a profile: best day of week, best hour, format performance breakdown, and character length sweet spot. Includes full metric bre"},{"name":"get_topic_insights","description":"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"},{"name":"get_engagement_trends","description":"Get engagement time series for a profile with gap-filled buckets, rolling averages, and trend direction. Each bucket includes avg engagement, likes, comments, s"},{"name":"search_posts","description":"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 "},{"name":"get_credit_balance","description":"Return the authenticated user's current credit balance, this period's monthly allocation, and credits used since the period started. Free."},{"name":"get_usage_history","description":"Return recent credit_ledger transactions for the authenticated user. Filter by tool name, reason, or date range. Paginated. Free."},{"name":"get_cost_estimate","description":"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, per"},{"name":"create_stream","description":"Create a new research stream (external profile, company, topic, person interests, hiring signals, or ad watch). Running the stream on its schedule costs credits"},{"name":"list_streams","description":"List all research streams for the authenticated user (external profiles, companies, topics, person interests, hiring signals, ad watches, and own_profile). Pass"},{"name":"get_stream_feed","description":"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_"},{"name":"pause_stream","description":"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 billin"},{"name":"resume_stream","description":"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 "},{"name":"delete_stream","description":"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"},{"name":"run_stream_now","description":"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 happen"},{"name":"linkedin_profile_info","description":"Fetch a LinkedIn person profile (headline, current role, work history, education, location). Costs 5 credits per call. Results are upserted into `people` (struc"},{"name":"linkedin_profile_posts","description":"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"},{"name":"linkedin_company_posts","description":"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 p"},{"name":"linkedin_post_search","description":"Search LinkedIn posts by keyword. Costs 5 credits per call. Returns a single page of matching posts."},{"name":"linkedin_profile_reactions","description":"Fetch the recent posts a LinkedIn person has reacted to. Useful for inferring interests. Costs 5 credits per call."},{"name":"linkedin_profile_comments","description":"Fetch the recent posts a LinkedIn person has commented on. Useful for inferring interests and conversation partners. Costs 5 credits per call."},{"name":"linkedin_job_search","description":"Search LinkedIn job postings. Useful for tracking hiring signals at target companies. Costs 5 credits per call."},{"name":"linkedin_ad_search","description":"Search the LinkedIn ad library. Useful for tracking competitor ad creative and messaging. Costs 10 credits per call."},{"name":"linkedin_people_search","description":"Search LinkedIn people. Filter by company, title, location, or free-text keywords. Costs 5 credits per call. Returns a single page of matching profiles."},{"name":"linkedin_company_search","description":"Search LinkedIn companies. Filter by keywords, industryId, or location. Costs 5 credits per call. Returns a single page of matching companies."},{"name":"linkedin_post_reactions","description":"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 s"},{"name":"linkedin_post_comments","description":"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 "},{"name":"find_similar_posts","description":"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 "},{"name":"score_draft","description":"Predict how a draft post will perform against the user's historical data. Uses an OLS regression model with detrending, ridge regularization, and recency weight"},{"name":"suggest_angles","description":"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 ca"},{"name":"list_segments","description":"List all audience segments for the authenticated user, with member counts. Audience segments are named groups of people (e.g. 'ICP — VPs of Marketing', 'Champio"},{"name":"create_segment","description":"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),"},{"name":"add_to_segment","description":"Add one or more people (by person_id) to an audience segment. Existing members are silently ignored. Free — costs 0 credits."},{"name":"remove_from_segment","description":"Remove one or more people (by person_id) from an audience segment. Missing members are silently ignored. Free — costs 0 credits."},{"name":"resolve_segment","description":"Resolve an audience segment into a concrete list of person_ids. For manual / auto_stream segments, returns stored members. For smart segments, evaluates the seg"},{"name":"list_segment_templates","description":"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 "},{"name":"get_alerts","description":"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 sk"},{"name":"create_collection","description":"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` predicat"},{"name":"add_to_collection","description":"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 "},{"name":"remove_from_collection","description":"Remove one or more posts (by post_id) from a collection. Missing members are silently ignored. Free — costs 0 credits."},{"name":"list_collections","description":"List all post collections for the authenticated user, with member counts. Includes manual collections, smart collections (predicate-based), and auto_stream coll"},{"name":"resolve_collection","description":"Resolve a post collection into a concrete list of post_ids. For manual / auto_stream collections, returns stored members. For smart collections, evaluates the c"},{"name":"create_campaign","description":"Create a Constellation outreach campaign. A campaign groups target accounts, the people you care about at those accounts, and the warm connections you could app"},{"name":"add_campaign_accounts","description":"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 — cos"},{"name":"map_constellation","description":"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"},{"name":"score_connections","description":"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"},{"name":"get_outreach_queue","description":"Return a prioritized outreach queue. Provide *exactly one* of three scopes:\n• `campaign_id` — full Constellation queue with composite_score, pool, recommended_a"},{"name":"get_engagement_brief","description":"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 "},{"name":"log_outcome","description":"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"},{"name":"get_campaign_stats","description":"Summary stats for a Constellation campaign: target count, entry count, outreach volume, and acceptance / reply rates broken down by pool (coworker / engager / m"},{"name":"save_post","description":"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 "},{"name":"get_post_engagers_by_company","description":"Given a LinkedIn post URL or id, return the companies whose people engaged (reacted/commented), ranked by engager count. Joins through person_positions(is_curre"},{"name":"get_engagement_industry_breakdown","description":"Histogram of engagers' companies grouped by industry. Pivots on companies.industry_hierarchy (e.g. 'Tech > Software Development'). Depth=1 buckets by top-level,"},{"name":"get_alumni_engagers","description":"Given a company URL or id, return engagers (across your collected posts) who have a position at that company. Relation filter: 'coworker' = current employees, '"},{"name":"get_engager_position_history","description":"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 c"},{"name":"get_target_warmth_brief","description":"For a target person, summarize all engagement evidence between them and your collected posts: posts they reacted to, posts they commented on, frequency, recency"},{"name":"traverse_graph_help","description":"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 re"},{"name":"traverse_graph","description":"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 + ca"},{"name":"get_company_engagement_overlap","description":"Given two companies, return engagers across your collected posts who engaged with BOTH companies' posts. Cross-account intelligence — finds people interested in"},{"name":"get_outreach_path","description":"Given a target person, find the shortest warm-intro path through your engager network. Walks coworker (shared current company) + alumni (shared past company / s"},{"name":"get_post_set_engagers","description":"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 (collectio"}],"toolCount":67,"toolsHash":"6350188bf28c4599c92dce7da3def0364d397cde8b62db6fa7979478edf87450","serverName":"flux","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"list_profiles","description":"List all tracked LinkedIn profiles for the authenticated user. Returns profile IDs needed by other tools."},{"name":"preview_profile","description":"Analyze a public LinkedIn profile or company page without a Flux account: pulls the latest ~50 posts (once per profile) and returns a teaser: post count, averag"},{"name":"preview_posting_insights","description":"Full breakdown for a previewed profile (from preview_profile): best day, hour, format and length, the top and bottom 5 posts with measured reasons, and engageme"},{"name":"preview_search_posts","description":"Keyword search over the latest 50 posts of a previewed profile (from preview_profile). Case-insensitive substring match; returns matching posts ordered by engag"},{"name":"claim_preview","description":"Make a profile from preview_profile your own Flux dashboard. Call this only when the person says the profile is theirs: the person cannot undo a claim. Requires"},{"name":"get_posts","description":"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 alr"},{"name":"get_profile_summary","description":"Get KPI summary for a tracked profile: total posts, average engagement (broken down by likes/comments/shares/conversation rate), posts per week, engagement tren"},{"name":"get_posting_insights","description":"Get optimal posting patterns for a profile: best day of week, best hour, format performance breakdown, and character length sweet spot. Includes full metric bre"},{"name":"get_topic_insights","description":"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"},{"name":"get_engagement_trends","description":"Get engagement time series for a profile with gap-filled buckets, rolling averages, and trend direction. Each bucket includes avg engagement, likes, comments, s"},{"name":"search_posts","description":"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 "},{"name":"get_credit_balance","description":"Return the authenticated user's current credit balance, this period's monthly allocation, and credits used since the period started. Free."},{"name":"get_usage_history","description":"Return recent credit_ledger transactions for the authenticated user. Filter by tool name, reason, or date range. Paginated. Free."},{"name":"get_cost_estimate","description":"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, per"},{"name":"create_stream","description":"Create a new research stream (external profile, company, topic, person interests, hiring signals, or ad watch). Running the stream on its schedule costs credits"},{"name":"list_streams","description":"List all research streams for the authenticated user (external profiles, companies, topics, person interests, hiring signals, ad watches, and own_profile). Pass"},{"name":"get_stream_feed","description":"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_"},{"name":"pause_stream","description":"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 billin"},{"name":"resume_stream","description":"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 "},{"name":"delete_stream","description":"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"},{"name":"run_stream_now","description":"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 happen"},{"name":"linkedin_profile_info","description":"Fetch a LinkedIn person profile (headline, current role, work history, education, location). Costs 5 credits per call. Results are upserted into `people` (struc"},{"name":"linkedin_profile_posts","description":"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"},{"name":"linkedin_company_posts","description":"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 p"},{"name":"linkedin_post_search","description":"Search LinkedIn posts by keyword. Costs 5 credits per call. Returns a single page of matching posts."},{"name":"linkedin_profile_reactions","description":"Fetch the recent posts a LinkedIn person has reacted to. Useful for inferring interests. Costs 5 credits per call."},{"name":"linkedin_profile_comments","description":"Fetch the recent posts a LinkedIn person has commented on. Useful for inferring interests and conversation partners. Costs 5 credits per call."},{"name":"linkedin_job_search","description":"Search LinkedIn job postings. Useful for tracking hiring signals at target companies. Costs 5 credits per call."},{"name":"linkedin_ad_search","description":"Search the LinkedIn ad library. Useful for tracking competitor ad creative and messaging. Costs 10 credits per call."},{"name":"linkedin_people_search","description":"Search LinkedIn people. Filter by company, title, location, or free-text keywords. Costs 5 credits per call. Returns a single page of matching profiles."},{"name":"linkedin_company_search","description":"Search LinkedIn companies. Filter by keywords, industryId, or location. Costs 5 credits per call. Returns a single page of matching companies."},{"name":"linkedin_post_reactions","description":"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 s"},{"name":"linkedin_post_comments","description":"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 "},{"name":"find_similar_posts","description":"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 "},{"name":"score_draft","description":"Predict how a draft post will perform against the user's historical data. Uses an OLS regression model with detrending, ridge regularization, and recency weight"},{"name":"suggest_angles","description":"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 ca"},{"name":"list_segments","description":"List all audience segments for the authenticated user, with member counts. Audience segments are named groups of people (e.g. 'ICP — VPs of Marketing', 'Champio"},{"name":"create_segment","description":"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),"},{"name":"add_to_segment","description":"Add one or more people (by person_id) to an audience segment. Existing members are silently ignored. Free — costs 0 credits."},{"name":"remove_from_segment","description":"Remove one or more people (by person_id) from an audience segment. Missing members are silently ignored. Free — costs 0 credits."},{"name":"resolve_segment","description":"Resolve an audience segment into a concrete list of person_ids. For manual / auto_stream segments, returns stored members. For smart segments, evaluates the seg"},{"name":"list_segment_templates","description":"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 "},{"name":"get_alerts","description":"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 sk"},{"name":"create_collection","description":"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` predicat"},{"name":"add_to_collection","description":"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 "},{"name":"remove_from_collection","description":"Remove one or more posts (by post_id) from a collection. Missing members are silently ignored. Free — costs 0 credits."},{"name":"list_collections","description":"List all post collections for the authenticated user, with member counts. Includes manual collections, smart collections (predicate-based), and auto_stream coll"},{"name":"resolve_collection","description":"Resolve a post collection into a concrete list of post_ids. For manual / auto_stream collections, returns stored members. For smart collections, evaluates the c"},{"name":"create_campaign","description":"Create a Constellation outreach campaign. A campaign groups target accounts, the people you care about at those accounts, and the warm connections you could app"},{"name":"add_campaign_accounts","description":"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 — cos"},{"name":"map_constellation","description":"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"},{"name":"score_connections","description":"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"},{"name":"get_outreach_queue","description":"Return a prioritized outreach queue. Provide *exactly one* of three scopes:\n• `campaign_id` — full Constellation queue with composite_score, pool, recommended_a"},{"name":"get_engagement_brief","description":"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 "},{"name":"log_outcome","description":"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"},{"name":"get_campaign_stats","description":"Summary stats for a Constellation campaign: target count, entry count, outreach volume, and acceptance / reply rates broken down by pool (coworker / engager / m"},{"name":"save_post","description":"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 "},{"name":"get_post_engagers_by_company","description":"Given a LinkedIn post URL or id, return the companies whose people engaged (reacted/commented), ranked by engager count. Joins through person_positions(is_curre"},{"name":"get_engagement_industry_breakdown","description":"Histogram of engagers' companies grouped by industry. Pivots on companies.industry_hierarchy (e.g. 'Tech > Software Development'). Depth=1 buckets by top-level,"},{"name":"get_alumni_engagers","description":"Given a company URL or id, return engagers (across your collected posts) who have a position at that company. Relation filter: 'coworker' = current employees, '"},{"name":"get_engager_position_history","description":"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 c"},{"name":"get_target_warmth_brief","description":"For a target person, summarize all engagement evidence between them and your collected posts: posts they reacted to, posts they commented on, frequency, recency"},{"name":"traverse_graph_help","description":"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 re"},{"name":"traverse_graph","description":"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 + ca"},{"name":"get_company_engagement_overlap","description":"Given two companies, return engagers across your collected posts who engaged with BOTH companies' posts. Cross-account intelligence — finds people interested in"},{"name":"get_outreach_path","description":"Given a target person, find the shortest warm-intro path through your engager network. Walks coworker (shared current company) + alumni (shared past company / s"},{"name":"get_post_set_engagers","description":"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 (collectio"}],"package":null,"toolSurface":{"id":"ts_348w355f24pu","endpointId":"ep_9wh78uwu9t9z","hash":"6350188bf28c4599c92dce7da3def0364d397cde8b62db6fa7979478edf87450","toolCount":67,"serverName":"flux","serverVersion":"0.1.0","protocolVersion":"2025-06-18","firstSeenAt":"2026-11-04T14:22:59.336Z","lastSeenAt":"2026-11-07T08:28:55.638Z","observations":9,"hiddenText":{"level":"none","total":0,"tools":0,"kinds":[],"findings":[]},"toolNames":["list_profiles","preview_profile","preview_posting_insights","preview_search_posts","claim_preview","get_posts","get_profile_summary","get_posting_insights","get_topic_insights","get_engagement_trends","search_posts","get_credit_balance","get_usage_history","get_cost_estimate","create_stream","list_streams","get_stream_feed","pause_stream","resume_stream","delete_stream","run_stream_now","linkedin_profile_info","linkedin_profile_posts","linkedin_company_posts","linkedin_post_search","linkedin_profile_reactions","linkedin_profile_comments","linkedin_job_search","linkedin_ad_search","linkedin_people_search","linkedin_company_search","linkedin_post_reactions","linkedin_post_comments","find_similar_posts","score_draft","suggest_angles","list_segments","create_segment","add_to_segment","remove_from_segment","resolve_segment","list_segment_templates","get_alerts","create_collection","add_to_collection","remove_from_collection","list_collections","resolve_collection","create_campaign","add_campaign_accounts","map_constellation","score_connections","get_outreach_queue","get_engagement_brief","log_outcome","get_campaign_stats","save_post","get_post_engagers_by_company","get_engagement_industry_breakdown","get_alumni_engagers","get_engager_position_history","get_target_warmth_brief","traverse_graph_help","traverse_graph","get_company_engagement_overlap","get_outreach_path","get_post_set_engagers"],"distinctSurfaces":1,"surfacesWithHiddenText":0},"endpointFacts":[{"id":"ep_9wh78uwu9t9z","url":"https://www.fluxgraph.app/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-11-05T15:22:49.318Z","auth":{"observedAt":"2026-11-05T15:22:50.710Z","authRequired":false,"scheme":null,"resourceMetadata":{"url":"https://www.fluxgraph.app/.well-known/oauth-protected-resource/mcp","resource":"https://www.fluxgraph.app/mcp","authorizationServers":["https://flqwttpbzetagwisyoly.supabase.co/auth/v1"],"scopesSupported":["email","profile"]},"authorizationServer":{"url":"https://flqwttpbzetagwisyoly.supabase.co/.well-known/oauth-authorization-server/auth/v1","issuer":"https://flqwttpbzetagwisyoly.supabase.co/auth/v1","grantTypesSupported":["authorization_code","refresh_token"],"codeChallengeMethodsSupported":["S256","plain"],"tokenEndpointAuthMethodsSupported":["client_secret_basic","client_secret_post","none"],"dynamicClientRegistration":true,"dpopSigningAlgValuesSupported":[],"clientIdMetadataDocumentSupported":null},"conformance":{"dpop":false,"rfc8414":true,"rfc9728":true,"pkceS256":true,"clientIdMetadataDocument":false,"dynamicClientRegistration":true}},"tls":{"observedAt":"2026-11-05T15:22:50.749Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"*.fluxgraph.app","issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validFrom":"2026-10-10T16:35:08.000Z","validTo":"2027-01-08T16:35:07.000Z","daysToExpiry":62,"sanCount":2,"fingerprint256":"EA:0E:66:8C:25:99:7C:09:2B:8A:4E:3E:41:E0:CE:C9:7F:4D:E5:E0:94:16:5E:83:D7:D6:FC:93:6C:AF:D5:82"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"app.fluxgraph/linkedin","url":"https://registry.modelcontextprotocol.io/v0/servers/app.fluxgraph%2Flinkedin","firstSeenAt":"2026-11-04T12:17:54.254Z","fetchedAt":"2026-11-04T12:17:54.254Z","normalizedAt":"2026-11-04T12:17:54.254Z"}]},"firstSeenAt":"2026-11-04T12:17:54.254Z","updatedAt":"2026-11-07T08:33:39.736Z"}