Meetalfred Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Meetalfred Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<!-- mcp-name: io.github.cphoskins/meetalfred-mcp -->
MCP server for MeetAlfred — LinkedIn automation campaign monitoring, lead management, reply tracking, messaging, tag management, campaign CRUD, and social post scheduling.
This server uses two MeetAlfred API layers:
| Layer | Auth | Required | Capabilities |
|---|---|---|---|
| Webhook API | MEETALFRED_API_KEY | Yes | Campaigns, leads, replies, connections, activity (read-heavy) |
| Internal API | MEETALFRED_JWT_TOKEN | No | Tags CRUD, campaign management, messaging, lead ops, post scheduling, notifications |
The webhook API provides core read operations. The internal API (optional) enables full CRUD, messaging, and richer data. Both work simultaneously.
pip install meetalfred-mcpOr install from source:
git clone https://github.com/cphoskins/meetalfred-mcp.git
cd meetalfred-mcp
pip install -e .token cookie valueAdd to your .claude/settings.json or project .mcp.json:
{
"mcpServers": {
"meetalfred": {
"command": "meetalfred-mcp",
"env": {
"MEETALFRED_API_KEY": "your-api-key-here",
"MEETALFRED_JWT_TOKEN": "your-jwt-token-here"
}
}
}
}If you're using a white-label MeetAlfred instance, set the base URLs:
{
"mcpServers": {
"meetalfred": {
"command": "meetalfred-mcp",
"env": {
"MEETALFRED_API_KEY": "your-api-key-here",
"MEETALFRED_JWT_TOKEN": "your-jwt-token-here",
"MEETALFRED_BASE_URL": "https://api.your-instance.com/api/integrations/webhook",
"MEETALFRED_API_BASE_URL": "https://api.your-instance.com/api/v1"
}
}
}
}Add to claude_desktop_config.json:
{
"mcpServers": {
"meetalfred": {
"command": "python",
"args": ["-m", "meetalfred_mcp.server"],
"env": {
"MEETALFRED_API_KEY": "your-api-key-here",
"MEETALFRED_JWT_TOKEN": "your-jwt-token-here"
}
}
}
}MEETALFRED_API_KEY)| Tool | Description |
|---|---|
get_campaigns | List campaigns by type (active, draft, archived, all) |
get_leads | Fetch leads with campaign and person details |
add_lead | Add a new lead to a campaign (LinkedIn URL required) |
get_replies | Get reply messages from leads across campaigns |
get_connections | Get LinkedIn connections with full profile data |
get_team_members | List team members (requires team owner access) |
get_member_connections | Get connections across team members |
get_last_actions | Get recent activity by type (invites, accepted, messages, replies, etc.) |
MEETALFRED_JWT_TOKEN)| Tool | Description |
|---|---|
get_all_tags | Get all tags (no pagination) |
list_tags | List tags with pagination and sorting |
create_tag | Create a new tag |
update_tag | Rename an existing tag |
delete_tag | Delete a tag |
MEETALFRED_JWT_TOKEN)| Tool | Description |
|---|---|
list_campaigns_detailed | List campaigns with full details, stats, and filtering |
get_campaign | Get full details of a single campaign |
get_campaign_counts | Get campaign counts by status |
get_campaigns_grouped | Get all campaigns grouped by category |
update_campaign | Update campaign fields (name, status) |
delete_campaign | Delete a campaign |
pause_campaign | Pause a running campaign |
resume_campaign | Resume a paused campaign |
rename_campaign | Rename a campaign |
clone_campaign | Clone (duplicate) a campaign |
archive_campaign | Archive a campaign |
MEETALFRED_JWT_TOKEN)| Tool | Description |
|---|---|
list_replies_detailed | List replies with full details and sorting |
get_conversation_messages | Get messages in a conversation thread |
send_message | Send a message in a conversation (reply to a lead) |
MEETALFRED_JWT_TOKEN)| Tool | Description |
|---|---|
get_campaign_leads | List leads in a campaign with status filtering |
get_lead_statuses | Get lead status counts for a campaign |
return_lead_to_campaign | Return leads to a campaign sequence |
add_tags_to_leads | Add tags to one or more leads |
exclude_leads | Exclude or un-exclude leads from campaigns |
MEETALFRED_JWT_TOKEN)| Tool | Description |
|---|---|
list_posts | List scheduled and published posts with engagement stats |
get_post_types | Get post counts by platform (LinkedIn, Facebook, Instagram, Twitter) |
get_post | Get full details of a single post (content, status, schedule, audience) |
create_post | Create a new scheduled LinkedIn post (set title, content, time, audience) |
update_post | Update a pending post's content, title, audience, or schedule |
update_post_time | Reschedule a pending post to a new time |
archive_post | Archive a post |
delete_post | Delete a post |
MEETALFRED_JWT_TOKEN)| Tool | Description |
|---|---|
get_current_user | Get the current authenticated user's profile |
get_unread_notification_count | Get count of unread notifications |
| Variable | Required | Description |
|---|---|---|
MEETALFRED_API_KEY | Yes | API key from Settings > Integrations > Webhooks |
MEETALFRED_JWT_TOKEN | No | JWT token for internal API (enables tags, campaign CRUD, messaging, post scheduling) |
MEETALFRED_BASE_URL | No | Override webhook API base URL for white-label instances |
MEETALFRED_API_BASE_URL | No | Override internal API base URL for white-label instances |
1. list_replies_detailed() → find reply with conversationUrn
2. get_conversation_messages(conversationUrn) → read conversation history
3. send_message(conversationUrn, "Your reply text")1. get_campaign_leads(campaignId, "replied") → find lead entityUrn
2. return_lead_to_campaign([entityUrn], campaignId)1. create_post(title="Internal label", content="Post body text", scheduled_at="2026-03-15T14:00:00.000Z")
2. list_posts() → verify post was created, get post ID
3. update_post_time(postId, "2026-03-16T15:00:00.000Z") → reschedule if needed1. get_all_tags() → find or create tag IDs
2. get_campaign_leads(campaignId) → get entity URNs
3. add_tags_to_leads([entityUrns], [tagIds])git clone https://github.com/cphoskins/meetalfred-mcp.git
cd meetalfred-mcp
pip install -e ".[dev]"
pytest tests/MIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.