Back to skill

Security audit

adaptlypost

Security checks for vulnerabilities and agentic risk

Overview

Posting has clear approval checks, but default account-connection links expose unrelated workspace accounts and allow unlimited account connections.

Use a dedicated Contributor token for drafts or Editor token for publishing. Before creating connection links, require PRIVATE visibility, selected platforms, a small account limit and short expiry; revoke links after use. Uploaded media becomes publicly accessible immediately, and webhooks receive workspace-wide events. The review concern is the connection-link defaults, not evidence of malicious intent.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (29)

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The code creates a webhook rather than performing a declared publishing, account-listing, status-checking, media-upload, or analytics operation. Registering an external event destination is a distinct configuration capability not disclosed in the description, and the supplied code does not establish it as a supporting step for an authorized posting task.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Publishing and revising post copy fit the declared posting workflow. However, deleting posts and cancelling existing schedules are additional state-changing capabilities not disclosed in the description or its explicit list of permitted use cases. The DELETE operation is particularly distinct from drafting, publishing, reviewing or checking status.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding

The scope mismatch alone would not establish a vulnerability, but the additional connection-link workflow uses a no-body example whose documented defaults expose every account in the group to the recipient and permit unlimited connections across platforms. Asking for a connection link does not necessarily authorize exposing unrelated workspace accounts, especially when this administrative capability is absent from the description.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
89% confidence
Finding

Listing and retrieving recurring posts reasonably supports scheduling and review. However, pausing, resuming and deleting recurring-post configurations changes ongoing publishing automation. These capabilities are not disclosed in the description or its explicit list of permitted user requests, so the code extends beyond the declared scope.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · SKILL.md (reported line 101)May include surrounding context.

md
w (content source, platforms, accounts, timing, and visibility) when they set the schedule up. Never escalate a draft-only schedule to live posting on your own; that change requires a fresh human confirmation. If a required confirmation cannot be obtained because nobody is present, save a draft and report back instead of guessing. A recurring post cannot be a draft, so an unattended run never creates one unless the user pre-authorized that exact series.
7. **Confirm before deleting anything.** `DELETE /social-posts/:id`, `DELETE /recurring-posts/:id`, `POST /recurring-posts/:id/pause`, `DELETE /webhooks/:id` and `DELETE /connect-links/:token` each need the user's "yes" for that exact id. Pausing or deleting a recurring post also deletes its upcoming scheduled post. Deleting a webhook silently stops the notifications someone else may rely on.
8. **Connect links are secrets.** Only create one when the user asks for it, give the `url` to that user in the current conversation, and never po

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · SKILL.md (reported line 101)May include surrounding context.

md
w (content source, platforms, accounts, timing, and visibility) when they set the schedule up. Never escalate a draft-only schedule to live posting on your own; that change requires a fresh human confirmation. If a required confirmation cannot be obtained because nobody is present, save a draft and report back instead of guessing. A recurring post cannot be a draft, so an unattended run never creates one unless the user pre-authorized that exact series.
7. **Confirm before deleting anything.** `DELETE /social-posts/:id`, `DELETE /recurring-posts/:id`, `POST /recurring-posts/:id/pause`, `DELETE /webhooks/:id` and `DELETE /connect-links/:token` each need the user's "yes" for that exact id. Pausing or deleting a recurring post also deletes its upcoming scheduled post. Deleting a webhook silently stops the notifications someone else may rely on.
8. **Connect links are secrets.** Only create one when the user asks for it, give the `url` to that user in the current conversation, and never po

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · SKILL.md (reported line 101)May include surrounding context.

md
w (content source, platforms, accounts, timing, and visibility) when they set the schedule up. Never escalate a draft-only schedule to live posting on your own; that change requires a fresh human confirmation. If a required confirmation cannot be obtained because nobody is present, save a draft and report back instead of guessing. A recurring post cannot be a draft, so an unattended run never creates one unless the user pre-authorized that exact series.
7. **Confirm before deleting anything.** `DELETE /social-posts/:id`, `DELETE /recurring-posts/:id`, `POST /recurring-posts/:id/pause`, `DELETE /webhooks/:id` and `DELETE /connect-links/:token` each need the user's "yes" for that exact id. Pausing or deleting a recurring post also deletes its upcoming scheduled post. Deleting a webhook silently stops the notifications someone else may rely on.
8. **Connect links are secrets.** Only create one when the user asks for it, give the `url` to that user in the current conversation, and never po

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · SKILL.md (reported line 101)May include surrounding context.

md
w (content source, platforms, accounts, timing, and visibility) when they set the schedule up. Never escalate a draft-only schedule to live posting on your own; that change requires a fresh human confirmation. If a required confirmation cannot be obtained because nobody is present, save a draft and report back instead of guessing. A recurring post cannot be a draft, so an unattended run never creates one unless the user pre-authorized that exact series.
7. **Confirm before deleting anything.** `DELETE /social-posts/:id`, `DELETE /recurring-posts/:id`, `POST /recurring-posts/:id/pause`, `DELETE /webhooks/:id` and `DELETE /connect-links/:token` each need the user's "yes" for that exact id. Pausing or deleting a recurring post also deletes its upcoming scheduled post. Deleting a webhook silently stops the notifications someone else may rely on.
8. **Connect links are secrets.** Only create one when the user asks for it, give the `url` to that user in the current conversation, and never po

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/api-reference.md (reported line 32)May include surrounding context.

md
| `POST /upload-urls` | `media.upload` | admin, editor, contributor |
| `GET /social-accounts` | `accounts.read` | all |
| `GET /social-accounts/:id/instagram-audio`, `GET /social-accounts/:id/pinterest-boards` | `posts.draft` | admin, editor, contributor |
| `POST /social-accounts/:id/check`, `DELETE /social-accounts/:id`, `POST /connect-links`, `DELETE /connect-links/:token` | `accounts.manage` | admin |
| `GET /webhooks`, `GET /webhooks/:id` | `webhooks.read` | admin, editor, viewer |
| `POST /webhooks`, `PATCH /webhooks/:id`, `DELETE /webhooks/:id`, `POST /webhooks/:id/test` | `webhooks.manage` | admin, editor |
| `GET /analytics/*` | `analytics.read` | all |

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · SKILL.md (reported line 118)May include surrounding context.

md
ies the platform's message. Do not schedule to it: `POST /social-posts` refuses it with `400`. Tell the user to reconnect it in the AdaptlyPost dashboard. Once they say they have, or when a post failed with a token error and you want to confirm the page is back, run `POST /social-accounts/:id/check` to re-probe the platform now; it returns the fresh `status`. Facebook pages are also re-checked automatically twice a day. When the user would rather drop an unauthorized account than reconnect it, `DELETE /social-accounts/:id` disconnects it from the workspace (Admin keys only); confirm with the user first, because it cannot be undone and pending posts stop publishing to it. **This applies to Facebook too**: the `id` is what goes into `pageIds`. Facebook page accounts also show a `pageId` field, the page's public ID on facebook.com, shown because pages have no `username`. `pageIds` accepts either that `pageId` or the account `id`, so both work.

### 2. Publish a post immediately (no schedu

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · SKILL.md (reported line 406)May include surrounding context.

-H "Authorization: Bearer $ADAPTLYPOST_API_KEY"

text

Returns `{ "url", "token", "expiresAt", "name", "visibility", "allowedPlatforms", "maxAccounts" }`. Give the `url` to the user who asked for it (Safety rule 8). Anyone holding it can attach an account to this group, so revoke it once used with `DELETE /connect-links/TOKEN`.

With no body the link offers every platform, shows the client every account in the group, has no limit and expires after 7 days. When the user wants more control, send any of `name`, `visibility: "PRIVATE"` (the client sees only what they connected), `allowedPlatforms`, `maxAccounts`, `expiresAt` (1 hour to 365 days away) or `neverExpires: true`. Only make a link that never expires when the user asks for one. The fields are in `references/api-reference.md`.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/api-reference.md (reported line 6)May include surrounding context.

md
Base URL: `https://post.adaptlypost.com/post/api/v1`
Auth: `Authorization: Bearer <api-token>` header. Tokens start with the `adaptly_` prefix.

The same header also accepts a WorkOS OAuth access token, which is how the hosted MCP server authenticates. For a skill, use an `adaptly_` token.

## Roles and permissions

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/api-reference.md (reported line 67)May include surrounding context.

md
"username": "",
      "avatarUrl": "",
      "status": "unauthorized",
      "unauthorizedReason": "This Page access token belongs to a Page that is not accessible.",
      "pageId": "123456789012345"
    }
  ]

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/api-reference.md (reported line 101)May include surrounding context.

"displayName": "My Business Page", "pageId": "123456789012345", "status": "unauthorized", "unauthorizedReason": "This Page access token belongs to a Page that is not accessible.", "checkedAt": "2026-09-13T09:10:00.000Z" }

text

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/api-reference.md (reported line 24)May include surrounding context.

md
| Endpoint | Permission | Roles |
| --- | --- | --- |
| `GET /social-posts`, `GET /social-posts/:id`, `GET /social-posts/:id/results`, `GET /recurring-posts`, `GET /recurring-posts/:id` | `posts.read` | all |
| `POST /social-posts` with `saveAsDraft: true`; `PATCH /social-posts/:id` and `DELETE /social-posts/:id` on a `DRAFT`; `POST /social-posts/:id/unschedule` on a dated `DRAFT` | `posts.draft` | admin, editor, contributor |
| `POST /social-posts` and `POST /social-posts/:id/publish` with a future `scheduledAt` (so every `POST /social-posts` with `recurrence`); `PATCH /social-posts/:id` and `POST /social-posts/:id/unschedule` on a post that is not a `DRAFT`; `POST /social-posts/bulk`; `POST /recurring-posts/:id/pause`, `POST /recurring-posts/:id/resume` | `posts.schedule` | admin, editor |
| `POST /social-posts` and `POST /social-posts/:id/publish` without `scheduledAt` or with a past one; `POST /social-posts/:id/retry`; `POST /social-posts/bulk` with any item due now or earlier | `p

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/api-reference.md (reported line 27)May include surrounding context.

md
t` | admin, editor, contributor |
| `POST /social-posts` and `POST /social-posts/:id/publish` with a future `scheduledAt` (so every `POST /social-posts` with `recurrence`); `PATCH /social-posts/:id` and `POST /social-posts/:id/unschedule` on a post that is not a `DRAFT`; `POST /social-posts/bulk`; `POST /recurring-posts/:id/pause`, `POST /recurring-posts/:id/resume` | `posts.schedule` | admin, editor |
| `POST /social-posts` and `POST /social-posts/:id/publish` without `scheduledAt` or with a past one; `POST /social-posts/:id/retry`; `POST /social-posts/bulk` with any item due now or earlier | `posts.publish` | admin, editor |
| `DELETE /social-posts/:id` on a post that is not a `DRAFT`; `DELETE /recurring-posts/:id` | `posts.delete` | admin, editor |
| Any write on a post or recurring post another member created | the row above, plus `posts.others` | admin, editor |
| `POST /upload-urls` | `media.upload` | admin, editor, contributor |
| `GET /social-accounts` | `accounts.read` | all |

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/api-reference.md (reported line 27)May include surrounding context.

md
t` | admin, editor, contributor |
| `POST /social-posts` and `POST /social-posts/:id/publish` with a future `scheduledAt` (so every `POST /social-posts` with `recurrence`); `PATCH /social-posts/:id` and `POST /social-posts/:id/unschedule` on a post that is not a `DRAFT`; `POST /social-posts/bulk`; `POST /recurring-posts/:id/pause`, `POST /recurring-posts/:id/resume` | `posts.schedule` | admin, editor |
| `POST /social-posts` and `POST /social-posts/:id/publish` without `scheduledAt` or with a past one; `POST /social-posts/:id/retry`; `POST /social-posts/bulk` with any item due now or earlier | `posts.publish` | admin, editor |
| `DELETE /social-posts/:id` on a post that is not a `DRAFT`; `DELETE /recurring-posts/:id` | `posts.delete` | admin, editor |
| Any write on a post or recurring post another member created | the row above, plus `posts.others` | admin, editor |
| `POST /upload-urls` | `media.upload` | admin, editor, contributor |
| `GET /social-accounts` | `accounts.read` | all |

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/api-reference.md (reported line 32)May include surrounding context.

md
| `POST /upload-urls` | `media.upload` | admin, editor, contributor |
| `GET /social-accounts` | `accounts.read` | all |
| `GET /social-accounts/:id/instagram-audio`, `GET /social-accounts/:id/pinterest-boards` | `posts.draft` | admin, editor, contributor |
| `POST /social-accounts/:id/check`, `DELETE /social-accounts/:id`, `POST /connect-links`, `DELETE /connect-links/:token` | `accounts.manage` | admin |
| `GET /webhooks`, `GET /webhooks/:id` | `webhooks.read` | admin, editor, viewer |
| `POST /webhooks`, `PATCH /webhooks/:id`, `DELETE /webhooks/:id`, `POST /webhooks/:id/test` | `webhooks.manage` | admin, editor |
| `GET /analytics/*` | `analytics.read` | all |

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/api-reference.md (reported line 34)May include surrounding context.

md
| `GET /social-accounts/:id/instagram-audio`, `GET /social-accounts/:id/pinterest-boards` | `posts.draft` | admin, editor, contributor |
| `POST /social-accounts/:id/check`, `DELETE /social-accounts/:id`, `POST /connect-links`, `DELETE /connect-links/:token` | `accounts.manage` | admin |
| `GET /webhooks`, `GET /webhooks/:id` | `webhooks.read` | admin, editor, viewer |
| `POST /webhooks`, `PATCH /webhooks/:id`, `DELETE /webhooks/:id`, `POST /webhooks/:id/test` | `webhooks.manage` | admin, editor |
| `GET /analytics/*` | `analytics.read` | all |
| `POST /analytics/sync` | `analytics.sync` | admin, editor |
| `POST /ai/*`, `GET /ai/images/:jobId` | `ai.generate` | admin, editor, contributor |

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/api-reference.md (reported line 108)May include surrounding context.

md
A rejected token marks the page `unauthorized` and fires `account.unauthorized`; a working token clears an earlier mark. Use it before a scheduling run when the user has just reconnected, or when a post failed with a token error and you want to confirm the page is back.

### DELETE /social-accounts/:id

Disconnects the account from the workspace, the same as removing it on the Connectors page: the stored login is deleted, the account comes off every pending and recurring post, and it stops counting toward the plan. It works on any `status`, so an `unauthorized` account can be cleaned up without reconnecting it. `:id` is the account `id` from `/social-accounts` or the Facebook `pageId`; for Facebook only that page goes, and other pages from the same login stay connected. Returns 404 when the workspace does not hold the account. It cannot be undone, so confirm with the user first.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/api-reference.md (reported line 620)May include surrounding context.

md
**Response:** the post as an undated draft, in the same shape as `GET /social-posts/:id`.

### DELETE /social-posts/:id

Delete a post record. Use it to cancel a `DRAFT` or `SCHEDULED` post; a deleted scheduled post will not publish. A post that is `PUBLISHING` right now is refused with `409` `Post is being published and cannot be deleted`; wait for it to finish. Other statuses are accepted, but deleting a `COMPLETED` or `PARTIAL_FAILURE` post only drops AdaptlyPost's record: the content already exists on each network, and removing it there is a manual step. Prefer `PATCH` over delete-and-recreate. Irreversible.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/api-reference.md (reported line 699)May include surrounding context.

md
Send the `url` to the person who owns the account. Anyone holding it can attach an account to your group, so treat it as a secret and revoke it once used.

### DELETE /connect-links/:token

Revoke a connect link before it is used or after it expires.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/api-reference.md (reported line 801)May include surrounding context.

md
**Response:** the recurring post with its new `status` and `nextOccurrenceAt`.

### DELETE /recurring-posts/:id

Stops the series and deletes its upcoming scheduled post. Posts that already went out are kept. Irreversible.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/api-reference.md (reported line 856)May include surrounding context.

md
Body accepts `url` and `active`. Set `active: false` to pause deliveries without losing the registration and its secret.

### DELETE /api/v1/webhooks/:id

**Response:** `{ "deleted": true }`

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 110)May include surrounding context.

1. List connected accounts

bash
curl -s -H "Authorization: Bearer $ADAPTLYPOST_API_KEY" \
  https://post.adaptlypost.com/post/api/v1/social-accounts

Static analysis

No suspicious patterns detected.