Guides

Hosted MCP server

Connect Claude and ChatGPT by signing in to Postiv, choosing a workspace, and approving access. API keys remain available for other clients.

New to the integration? Explore the Postiv LinkedIn MCP server for a workflow demo, client setup instructions, and examples of research, drafting, scheduling, and analytics.

Connect your AI app to Postiv with OAuth: sign in with your own Postiv account, select the workspace it can use, and approve permissions. No organization API key is needed for Claude or ChatGPT. Posts and carousels created through OAuth are attributed to the signed-in Postiv user within the approved workspace.

MCP server URL
https://postiv.ai/mcp
OAuth client ID (public; no secret)
3db7f794-4990-4a61-a4e9-855d0c052eb5

Use the public client ID above when your app asks for OAuth client details. Leave the client secret empty. Choose a predefined or user-defined client if offered; automatic client registration is not required for this setup.

For a guided setup with copy buttons, open Connect Postiv. Custom connector availability depends on your AI app plan and workspace policy.

Connect Postiv to Claude

Add a custom connector, then sign in with your Postiv account.

Open Claude connectors

  1. 1
    Open Claude connectors, choose Add custom connector, and name it Postiv.
    The Claude connectors page with the Add menu open on Add custom connector
  2. 2
    Paste the MCP server URL from this guide and choose Continue. Wait for Claude to check the server.
    The Add custom connector dialog with the Postiv name and the MCP server URL filled in
  3. 3
    On the authentication step, select Always required and Use your own OAuth client. Enter the OAuth client ID from this guide and leave the client secret empty. Then choose Add.
    The Claude authentication step with Always required and Use your own OAuth client selected and the public client ID entered
  4. 4
    Choose Connect on the Postiv connector. Sign in to Postiv, select your workspace, review the permissions, and choose Connect workspace.
  5. 5
    Enable Postiv in a new conversation and ask it to confirm your workspace and list your LinkedIn profiles.
If your Claude version shows Advanced settings instead of a second setup step, enter the same client ID there and leave the secret empty. If Postiv already exists, use that connector instead of adding a duplicate.

Current Claude requirements

Connect Postiv to your ChatGPT account

Create a custom MCP app for your own account. Availability depends on your plan and workspace settings.

Add Postiv in ChatGPT

  1. 1
    On chatgpt.com, open Settings → Security and login and enable Developer mode. Some accounts show it under Apps → Advanced settings.
    ChatGPT Security and login settings with the Developer mode toggle switched on
  2. 2
    Open the connector form, name the app Postiv, paste the MCP server URL from this guide, and choose OAuth. If the form does not open, go to Plugins and choose Create app.
    ChatGPT New Plugin form with the Postiv name, the MCP server URL, OAuth authentication and the public client ID filled in
  3. 3
    In advanced OAuth settings, choose User-Defined OAuth Client. Enter the client ID from this guide, leave the secret empty, and set token endpoint authentication to none.
  4. 4
    Turn OpenID/OIDC off. Keep email selected under Default scopes, and enter offline_access in Base scopes so ChatGPT can refresh access.
    ChatGPT advanced OAuth settings with OIDC enabled unchecked and offline_access in the scopes list
  5. 5
    Review the custom-server notice, create the app, and choose Sign in with Postiv. Select your workspace, review the permissions, and choose Connect workspace.
    ChatGPT custom MCP server notice with the confirmation checkbox ticked and the Create button
    The Add Postiv to ChatGPT consent screen with the Sign in with Postiv button
  6. 6
    Back in ChatGPT, refresh the app tools if needed. Choose Try in chat, or start a new chat and select Postiv from the tools menu. Ask it to confirm your workspace and list your LinkedIn profiles.
If ChatGPT reports an invalid redirect URI, send the exact callback URL shown in its OAuth settings to Postiv support. That return address must be registered before sign-in can finish.

Current ChatGPT (web) requirements

Workspace and permissions

Read & write is selected by default for new connections and allows creating, editing, deleting, scheduling, and publishing content, plus approvals and engagement actions. Choose Read only if you only need research and reporting.

The workspace you approve stays fixed for that connection. Postiv checks your current workspace access on every request, including agency access. Existing LinkedIn profile approval rules still apply.

Token refresh and reconnecting

Your AI app uses refresh tokens to renew access automatically while the authorization remains valid. You do not need to copy or rotate access tokens yourself. If the app asks you to sign in again, reconnect from its connector settings. Losing workspace access or revoking the connection stops access.

Existing connections keep their original permissions. To change workspace or access, revoke the connection in Postiv and reconnect. Claude and ChatGPT currently share the Postiv MCP authorization, so revoking it can disconnect both.

Manage or revoke connected apps. Revoking an OAuth connection does not invalidate an organization API key.

Connection troubleshooting

ProblemWhat to check
ChatGPT sign-in fails after consentTurn OpenID/OIDC off in advanced OAuth settings; use client authentication none, leave the secret empty, and keep email selected, and enter offline_access in Base scopes.
Invalid redirect URICopy the exact callback URL shown by your AI app and contact Postiv support to register it. Do not change the MCP server URL or paste a callback from another account.
Connected, but no tools appearRefresh the connector tools, then enable Postiv in a new conversation. In ChatGPT, Try in chat opens a conversation with the app selected.
Reads work, but writes failAn existing read-only grant stays read-only. Revoke it in Postiv and reconnect with Read & write.
Wrong workspaceRevoke the existing Postiv authorization and reconnect, selecting the intended workspace.
A previous API-key connection is still in useRemove that connector from your AI app and add the clean MCP server URL using OAuth. Other clients using the key keep working.

Other clients and existing API keys

Claude Code, Cursor, Codex, and generic HTTP clients can still use an organization API key. An admin can generate one in Postiv integrations; see API-key setup. The examples below use key authentication. OAuth in another client requires its exact callback URL to be registered first.

Existing Authorization bearer headers, x-api-key headers, and secret URLs such as https://postiv.ai/mcp/pk_postiv_... remain supported. Treat keys and any URL containing one like passwords. The REST API continues to use organization API keys.

Claude Code

Terminal
claude mcp add --transport http postiv https://postiv.ai/mcp \
  --header "Authorization: Bearer pk_postiv_..."

Cursor with an API key

Open Postiv setup in Cursor. This adds an environment-variable template, not a credential. Set POSTIV_API_KEY in the environment used to launch Cursor, restart Cursor, and enable the server. See Cursor install links and environment-variable configuration.

.cursor/mcp.json
{
  "mcpServers": {
    "postiv": {
      "url": "https://postiv.ai/mcp",
      "headers": {
        "Authorization": "Bearer ${env:POSTIV_API_KEY}"
      }
    }
  }
}

Generic Streamable HTTP client

mcp.json
{
  "postiv": {
    "url": "https://postiv.ai/mcp",
    "headers": {
      "Authorization": "Bearer pk_postiv_..."
    }
  }
}

Claude Desktop with mcp-remote

claude_desktop_config.json
{
  "mcpServers": {
    "postiv": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://postiv.ai/mcp",
        "--header",
        "Authorization: Bearer pk_postiv_..."
      ]
    }
  }
}

Available tools

Tools use the approved workspace permissions. Hosts that support MCP Apps can display interactive post, image, carousel, and inspiration widgets.

ToolScopeDescription
resolve_linkedin_mentionprofiles:readResolve a LinkedIn person, company, school or showcase URL using the posting integrationId. Returns a URN and ready-to-insert mention token for create_post/update_post captions or comment_on_post/reply_to_comment text. Optional displayName controls the label. Personal URL lookup requires Community Management access and an administered page; unresolved URLs fail explicitly. Comment/reply tokens are converted into LinkedIn mention attributes; plain @Name is not a tag. MCP only.
suggest_replyengage:writeGenerate a reply suggestion from a live post/comment and selected profile voice. Does not publish. MCP only.
list_engagement_postsengage:readTeam (including your own profiles/pages) or external-feed discovery. Live post reads; team threads and unanswered counts refresh completely. status=unanswered; author/list/creator/text/engagement filters; days and before/nextCursor pagination. Failed posts appear in failedItems with partial=true; healthy posts remain available. Counts cover successful refreshes only (null if all fail). Feed discovery remains indexed, requires acting integrationId for reads. MCP only.
get_post_commentsengage:readLive-refresh a complete thread by opaque postId. Returns commentId, parentCommentId, status and unansweredCount. Reading does not dismiss. No cached fallback. MCP only.
comment_on_postengage:writeImmediately publish a top-level LinkedIn comment using postId, integrationId and text (1–1250 characters). MCP only.
reply_to_commentengage:writeLive-check commentId on postId, automatically prefix a real tag of the comment author when their name and URN are available, publish a reply as integrationId, then refresh the thread. Pass the reply body without that prefix; existing leading author tags are not duplicated. The 1250-character limit includes the added name. Published-with-warning results must not be retried. MCP only.
react_to_postengage:writeReact to postId or optional commentId as integrationId; reactionType=null removes. MCP only.
dismiss_commentengage:writeMark a team comment no reply needed in Postiv; clears unanswered status without changing LinkedIn. MCP only.
delete_commentengage:writeDelete the actual LinkedIn comment using commentId and integrationId. Requires this authenticated actor’s recorded comment; supports both sources and new replies. MCP only.
list_engage_feed_listsengage:readList current workspace external-feed tracking lists.
create_engage_feed_listengage:writeCreate a tracking list, maximum five per workspace. MCP only.
add_engage_feed_profileengage:writeTrack a personal LinkedIn profile, maximum thirty per list. Discovery can be pending. MCP only.
remove_engage_feed_profileengage:writeRemove a profile from one tracking list. MCP only.
get_workspaceworkspace:readRead the connected workspace (name, slug) and which scopes this key has. Call first.
submit_feedbackfeedback:writeSend explicit feedback about Postiv or Bob to the product team.
add_knowledgeknowledge:writeAdd a text document to the workspace knowledge base for retrieval by Postiv's AI.
search_knowledgeknowledge:readSemantically search the workspace knowledge base before drafting, to ground content in real facts.
search_templatesposts:readSearch Postiv's proven post-writing templates (global + workspace custom).
search_inspirationinspiration:readSearch the moderated LinkedIn inspiration library by semantic query and/or exact filters; renders as a swipeable carousel in widget-capable hosts.
list_linkedin_profilesprofiles:readList connected LinkedIn profiles/company pages and their integration ids.
get_writing_styleprofiles:readRead the trained writing style for one profile (voice, structure, examples).
list_content_plansplans:readList Bob's weekly content plans for a profile, with pillar distribution.
get_content_plan_itemplans:readRead one plan item in full detail, including saved source material/research.
get_bob_planning_settingsplans:readRead Bob's status, cadence, pillar count, and current-week plan state for a profile.
update_bob_planning_settingsplans:writeUpdate Bob's posting cadence for a profile.
list_pillarsplans:readList a profile's recurring content pillars (summary only).
get_pillarplans:readRead one pillar's full content and 30-day performance.
list_team_briefsteam_briefs:readList team writing assignments and per-member progress.
get_team_briefteam_briefs:readRead one team brief's full instructions, deadline, and assignment progress.
create_team_briefteam_briefs:writeCreate a team writing assignment for every current workspace member (owners/admins only).
create_pillarplans:writeCreate a recurring content pillar for one LinkedIn profile.
update_pillarplans:writeUpdate an active content pillar while preserving system-owned learnings.
archive_pillarplans:writeSoft-delete a pillar from future weekly planning.
list_pending_approvalsapprovals:readList exact scheduled-post copy, refreshed media, carousel PDF, author/profile details, and approval history awaiting the API-key actor's decision.
approve_scheduled_postapprovals:writeRecord the API-key actor's approval without bypassing other approvers.
request_approval_changesapprovals:writeReturn a pending post to its author with revision feedback.
deny_scheduled_postapprovals:writeDeny an assigned scheduled post and prevent publishing.
create_scratchpad_itemscratchpad:writeSave a quick note/url/image into the org's shared scratchpad.
list_scratchpad_itemsscratchpad:readList all live scratchpad items.
update_scratchpad_itemscratchpad:writeEdit a scratchpad item's content and/or status.
delete_scratchpad_itemscratchpad:writePermanently delete a scratchpad item.
promote_scratchpad_itemscratchpad:write, knowledge:writePromote a scrap into a permanent org knowledge asset (deletes the scrap on success).
get_comment_plug_configprofiles:readRead default Comment Plug settings for one or all profiles.
set_comment_plug_configposts:scheduleSet a profile's default Comment Plug (auto first-comment) used by future scheduled posts.
create_postposts:writeCreate a LinkedIn post draft; humanizer is opt-in (default false) and hook-lint always runs before saving.
list_postsposts:readList posts filtered by status/profile/search, with 300-char content previews.
get_postposts:readRead one post's full current content and status.
update_postposts:writeUpdate a draft's title/content/profile; fails on scheduled/published posts.
schedule_postposts:scheduleQueue a draft for publishing (>=2min in the future); waits for approvers if configured. Also accepts mediaSource with exactly one url, assetId, imageId, or carouselId for PDF/video/image/carousel/infographic selection through the existing publish queue. Do not combine mediaSource with mediaType/mediaUrls/carouselId.
unschedule_postposts:scheduleCancel a scheduled post, returning it to draft.
reschedule_postposts:scheduleMove a scheduled post to a new time.
generate_post_imageimages:writeGenerate a brand-new AI image for a post via style preset or freeform prompt (MCP-ONLY: no REST equivalent exists). Returns a 7-day signed URL + markdown image line to relay.
edit_post_imageimages:writeEdit an existing image with a natural-language instruction, stacking a new version.
create_carouselposts:writeCreate a multi-slide carousel from a structured content outline (content only, never HTML).
create_infographicposts:writeCreate a single-canvas infographic (content only, never HTML), publishes as an image post.
render_carouselposts:writeRender slide PNGs + PDF (carousel) or canvas PNG (infographic) for the latest version; idempotent.
get_carouselposts:readRead one carousel/infographic's slide summaries and render/PDF readiness.
edit_carousel_slideposts:writeEdit one slide (or the infographic canvas) with a natural-language instruction.
list_analytics_accountsanalytics:readList tracked LinkedIn analytics accounts, each mapping to one profile.
get_analytics_summaryanalytics:readCached KPI totals for one account or 'all', over a period or date range.
get_performance_overviewanalytics:readCached day-by-day impressions/engagements time series.
get_top_postsanalytics:readTop posts by date/engagements/impressions or outlier-vs-baseline sorts.
get_post_analyticsanalytics:readCached analytics for one specific post.
upload_mediaposts:writeShow an inline Postiv file picker and drop zone in the conversation. Uses the MCP connection without another sign-in. Up to 20 files; images 10 MB, PDFs 50 MB, videos 200 MB. Saved asset references return to the conversation. Use when the assistant cannot read the file bytes.
prepare_media_uploadposts:writeBackground upload: request a signed multipart POST form for fileName, contentType, and bytes. Send all fields plus the file bytes, then call complete_media_upload. Also used by the inline widget.
complete_media_uploadposts:writeFinalize a transferred uploadId after server-side size, signature, actor and workspace checks. Returns a reusable assetId; retries return the same asset. Does not attach, schedule, or publish.
get_media_upload_linkposts:readLegacy web-page fallback when explicitly requested; prefer upload_media for the inline card. Open a workspace-specific browser page to drag and drop or select a local image (10 MB), PDF (50 MB), or video (200 MB). Sign in with the same Postiv account as the assistant. After upload, paste the asset reference back into the conversation. The assistant can use assetId to attach an image or mediaSource.assetId to schedule media after authorization. No public hosting required. MCP only.
list_mediaposts:readBrowse reusable images, PDFs, videos, carousels, and infographics. GET /api/public/media supports type, query, limit, and offset. Results include image attachInput, scheduleInput for all formats, and signed preview/file URLs.
attach_post_mediaposts:write, images:writeAttach an image using exactly one url, assetId, or imageId and postId, without scheduling or AI generation. POST /api/public/posts/:id/media. Uses existing image attachment storage. Remote raster images: 10MB. Other formats use schedule_post.mediaSource, matching the editor scheduling flow.
detach_post_mediaposts:writeRemove a draft image attachment without deleting its library file. DELETE /api/public/posts/:id/media.