vk-mcp-server
An MCP server that lets an AI assistant read and write VK (VKontakte) content — profiles, walls, communities, photos, friends, likes and stats — through typed, paginated tools.
Users: look up profiles by numeric ID or screen name, and search users by name, city, country, sex and age.
Wall: read posts newest-first with pagination, fetch specific posts by
{owner_id}_{post_id}, publish new posts (optionally scheduled or on behalf of a community), edit or delete posts, and add comments.Photos: upload an image from a URL or local path and get an attachment string for posts; list photos from an album (
wall,profile,savedor numeric).Communities: search communities by keyword/type/sort, get info by ID or short name, list the communities you belong to, list members (with optional filters like managers or friends), and join or request to join.
Other reads: friends list, your newsfeed, users who liked/reacted to a post, comment, photo or video, and community statistics for admins.
Output quality: every list tool returns total counts plus pagination (
next_offset,next_from) so the model can page through results instead of stopping at the first page, and every tool declares a typed output schema.Presentation: on hosts supporting MCP Apps (Claude, VS Code Copilot, Goose), users, walls and communities render as rich cards.
Safety hints: each tool carries MCP annotations — read-only lookups are marked
readOnlyHint, while posts, edits, deletes, joins and uploads are flagged so clients can ask for approval first.
Note: the README also advertises stories, community-message (inbox/reply) tools and prompt workflows, but those do not appear in this schema.
VK MCP Server
Features
25 tools across users, walls, communities, photos, stories, community messages, likes and statistics
Your community's inbox: list unread conversations, read them, and reply as the community — the assistant drafts, you approve, it sends
Read and write as a community: with a community token and a service key together, the assistant reads walls, profiles and communities and posts, comments, publishes stories and answers messages as your community. Writes are marked as such so your client can ask first. Some tools (search, likes, statistics, editing) need a full user token, which VK no longer issues to new apps — the setup guide lists exactly what each token reaches
Structured output: every tool declares an output schema, so the model gets typed data instead of a JSON blob it has to parse out of text
Pagination that explains itself: list results say how many matches exist and which offset continues from here, so the model can page through a wall instead of stopping at the first twenty posts
Things you can look at: on hosts that support MCP Apps — Claude, Claude Desktop, VS Code Copilot, Goose — walls, communities and profiles render as cards: posts with their photos and clip previews, communities with their banner and size, profiles with avatar and following. Everywhere else it behaves exactly as before
Prompts: ready-made workflows — community digest, engagement report, audience snapshot, community search, community inbox
Resilient: request timeouts, automatic backoff when VK rate-limits, and clear messages for captchas and HTTP failures
Honest about tokens: VK has three kinds and they differ enormously in reach.
--checknames which one you hold and probes what it can actually do,--loginwalks the VK ID flow for the reading kind, and every VK error carries the fix rather than the code aloneTested: 140+ tests driving the real server over the MCP protocol
Related MCP server: Cyclops
Quick Start
Claude Desktop — one click
Download the latest .mcpb bundle from the
releases page and
open it. It installs the server, asks for your VK token in a form field, and
stores it securely — no Node.js, no config files, no terminal.
VS Code — one click
VS Code prompts for your VK token and keeps it out of the config file. From a terminal instead:
code --add-mcp '{"name":"vk","command":"npx","args":["-y","vk-mcp-server"],"env":{"VK_ACCESS_TOKEN":"your_token"}}'npm
npx vk-mcp-serverOr install globally with npm install -g vk-mcp-server.
MCP Registry
Also available in the official MCP Registry:
io.github.bulatko/vkGetting VK Access Token
To let the assistant post, you need a community token. Open a community you
manage → Manage → API usage → Access tokens → Create token,
ticking wall, photos, stories, messages and manage. Three clicks, no
app, never expires, tied to no browser or IP. It posts, comments and publishes
stories as the community.
Add a service key next to it, and the assistant reads walls too. VK refuses
a community token wall reads (error 27). Set the service key from your VK app's
settings page as VK_SERVICE_KEY, and the server makes every read the token is
refused with the key instead — writes never go to it:
"env": {
"VK_ACCESS_TOKEN": "vk1.a...community token",
"VK_SERVICE_KEY": "...service key"
}What no token VK issues to a new app can do, checked against the live API in October 2026: edit or delete posts, upload wall photos, read statistics, likes, photo albums, search or the newsfeed. VK keeps those for full user tokens, which it no longer grants.
For public reads alone, the service key on its own is enough (as
VK_SERVICE_KEY or VK_ACCESS_TOKEN), or sign in as yourself:
npx vk-mcp-server --login <YOUR_APP_ID>Worth knowing before you spend an evening on it: --login returns a VK ID
token (vk2.a…), which VK issues for signing in rather than for the API. It
reads public profiles, walls and community info; posting, photos, friends,
feeds and statistics all answer error 1051, whatever scopes you request. The
older flow that granted full user tokens now refuses newly created apps
outright. npx vk-mcp-server --check names which kind you hold and what it
reaches.
Use your own app rather than an App ID from somewhere else: a token dies with the app that issued it, and the error gives no hint that this is what happened.
📖 Full setup guide — every step with the exact screens, what the scopes unlock, remote installs, and what each error means.
Configuration
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"vk": {
"command": "npx",
"args": ["-y", "vk-mcp-server"],
"env": {
"VK_ACCESS_TOKEN": "your_access_token_here"
}
}
}
}Claude Code
Add to your project's .mcp.json:
{
"mcpServers": {
"vk": {
"command": "npx",
"args": ["-y", "vk-mcp-server"],
"env": {
"VK_ACCESS_TOKEN": "your_access_token_here"
}
}
}
}Environment variables
Variable | Required | Default | Purpose |
| for tool calls | — | The token tools act with, usually a community token. The server starts and lists its tools without one; calling a tool then returns an error saying so |
| no | — | Service key from your VK app. Reads the access token is refused (a wall, under a community token) are made with it; never used for writes. On its own, it is enough for public reads |
| no |
| Abort a VK request that hangs longer than this |
| no |
| Point the server at an API mirror or proxy |
VK rate-limits user tokens to a few calls per second. When it answers with error 6 (too many requests), the server backs off and retries up to three times before giving up, so short bursts of tool calls do not fail outright.
Command line
Command | What it does |
| Runs the MCP server (this is what your client calls) |
| Gets a token through VK ID in your browser |
| Reports what your token is and which tools it can use |
| Lists the commands and environment variables |
Troubleshooting
Start with:
VK_ACCESS_TOKEN=your_token npx vk-mcp-server --checkIt identifies which of the three token types you have — user, community or service — and probes what that token can actually reach, so you find out up front instead of discovering it tool by tool. It never calls a write method.
Common cases:
What you see | What it means |
| The VK app that issued the token is blocked. Every token from it fails this way, however valid the token looks. Create your own app and issue a fresh token. |
| The token is not accepted: revoked, deleted or replaced by a newer one — or pasted with quotes, spaces or a trailing comment. Check it is the whole token; if so, create a fresh one where it came from (a community token: Manage → API usage → Access tokens). |
| A community token asked for something VK keeps from it — reading a wall, say. Set |
| A VK ID token or a service key asked for a method closed to it. To post, use a community token. |
| The data is restricted — a private profile, or a community that hides its members. |
| VK bound the token to the IP that authorised it, and the server is on a different one. Common when the server runs on a VPS but you signed in from your laptop. Get the token on the machine that runs the server, or use a community token. |
| The old implicit OAuth flow. Use |
| The server is running but your client never passed |
The server turns these into messages that say what to do, so the model can usually explain the fix without you reading this table.
Available Tools
Tools marked ✏️ change something on VK — they post, edit, delete or join on
behalf of whoever owns the access token. Each tool also carries MCP annotations
(readOnlyHint, destructiveHint), so a client can auto-approve lookups while
still asking before a post is edited or deleted.
The model sees only the tools your token reaches. On start the server asks VK
which token it holds — community, user, VK ID or service key — and leaves out
the tools VK would refuse it, so the model does not discover the limits one
error at a time. vk_token_info says which token it is and, for each tool
left out, what would open it. With no token, or when VK cannot tell, every
tool is listed.
Users
Tool | Description |
| Get user profiles by IDs or screen names |
| Search users by name, city, age and other criteria |
Wall
Tool | Description |
| Get posts from user/community wall |
| Get specific posts by |
| ✏️ Publish a new post |
| ✏️ Edit an existing post |
| ✏️ Delete a post |
| ✏️ Add comment to a post |
Groups
Tool | Description |
| Get user's communities list |
| Get community info by ID |
| Search communities by name and criteria |
| Get community members |
| ✏️ Join a community or request to join |
Photos
Tool | Description |
| Get photos from albums |
| ✏️ Upload a photo and get an attachment string for |
Stories
Tool | Description |
| ✏️ Publish a photo story, personal or on behalf of a community |
| ✏️ Publish a video story, personal or on behalf of a community |
Community messages
Need a community token with the messages right, and messages switched on in
the community settings. VK lets a community write only to people who wrote to
it first or allowed its messages.
Tool | Description |
| List the inbox, newest first; |
| Read one conversation |
| ✏️ Reply as the community — reaches a real person, so clients should ask first |
| ✏️ Mark a conversation as read |
Community events
VK refuses a community token comments, likes and the wall, but sends them as
events to a community that listens. Call vk_events_listen once: it turns on
the community's Long Poll and the event types if they are off — leaving the API
version alone when another bot already reads it — and starts receiving. VK
keeps no history: you see what happens from that moment on, while the server
runs. Deleting comments stays closed to a community token.
Tool | Description |
| ✏️ Start receiving new comments (text and ID), likes, posts and reposts, joins and leaves, messages |
| Read them by cursor; |
Other
Tool | Description |
| Get user's friends list |
| Get user's newsfeed |
| Get users who liked an object, with reaction counts |
| Get community statistics (admin only) |
| Which token is connected, which tools work with it, and what would open the rest |
Prompts
Prompts appear in your client as ready-made workflows — pick one, fill in the community, and the model knows which tools to use.
Like the tools, the prompt list follows the token: a prompt is offered only
when the token reaches the tools it relies on, and publish_post leaves out the
steps (reading the wall, uploading the image) the token cannot take.
Prompt | What it does |
| Reads recent posts and summarises themes, standouts and cadence |
| Ranks posts by likes and by comments, then explains what the winners share |
| Samples members and describes the audience by sex, city and activity |
| Drafts a post in the community's own tone, shows it for approval, publishes it |
| Searches communities on a topic and compares the candidates |
| Goes through unread messages, summarises each and drafts replies; sends only what you approve |
Usage Examples
Once configured, you can ask Claude:
"Get information about Pavel Durov's VK profile"
"Show me the latest 5 posts from the VK official community"
"Post 'Hello World!' on my wall"
"Get the list of communities I'm a member of"
"Show my newsfeed"
Example Conversation
A real exchange — the numbers below came back from VK while this was written.
You: How big is the VK Mini Apps community, and how are its recent posts doing?
Claude: [vk_groups_get_by_id group_ids="apiclub", fields="members_count,activity"]
[vk_wall_get domain="apiclub", count=3]
VK Mini Apps (@vkappsdev, id 166562603) — 245,457 members, filed under
Programming, with 898 posts on the wall. The three most recent:
21 Jan 22,653 views 46 likes 15 reposts "Готовы сделать этот год прорывным?..."
20 Jul 529 views 18 likes 0 reposts (photo post, no text)
13 Jul 3,782 views 11 likes 3 reposts "Суперсила игр и приложений в соцсети..."
The January post reached forty times the audience of the July ones —
worth a look at what it did differently.The model gets each of those numbers as typed fields rather than text it has to parse, because every tool declares an output schema.
Changelog
See CHANGELOG.md.
Testing
Run the test suite:
npm testRun tests with coverage:
npm run test:coverageAPI Reference
This server wraps VK API v5.199. For detailed parameter documentation, see:
Security Notes
Never share your access token
The
offlinescope provides a non-expiring tokenReview permissions before authorizing
For production, consider using a service token
Contributing
Contributions are welcome! Please read the Contributing Guidelines first.
Fork the repository
Create your feature branch (
git checkout -b feature/amazing-feature)Commit your changes (
git commit -m 'Add some amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
License
MIT © 2026 bulatko
Links
Available Tools
25 toolsvk_friends_getList friendsARead-onlyIdempotent
List a user's friends. Returns bare IDs unless you ask for fields. Needs a user token, and only works for profiles that expose their friend list.
Inputs: count, order, fields, user_id. Returns: count, items, pagination
vk_groups_getList your communitiesARead-onlyIdempotent
List the communities the token owner belongs to. Needs a user token — a community or service token cannot answer this.
Inputs: count, fields, filter, user_id. Returns: count, items, pagination
vk_groups_get_by_idGet community infoARead-onlyIdempotent
Look up communities by numeric ID or short name (e.g. apiclub). Use it to resolve a name to an ID, or to read the description, member count and type before deciding what to do with it.
Inputs: fields, group_ids. Returns: groups
vk_groups_get_membersList community membersARead-onlyIdempotent
List the members of a community. Returns bare user IDs unless you ask for fields, in which case it returns profiles. Many communities hide their member list, which comes back as an access error rather than an empty list.
Inputs: group_id (required), sort, count, fields, +2 more. Returns: count, items, pagination
vk_groups_joinJoin a communityAIdempotent
Join a community as the token owner, or send a join request if it is closed. group_id is positive here, without the minus sign.
Inputs: group_id (required), not_sure. Returns: success
vk_groups_searchSearch communitiesARead-onlyIdempotent
Find communities by keyword, optionally narrowed by type, country, city or sort order. Returns matches with a total count.
Inputs: q (required), sort, type, count, +5 more. Returns: count, items, pagination
vk_likes_getSee who reactedARead-onlyIdempotent
List the users who liked or reacted to an object — a post, comment, photo or video — with counts per reaction. owner_id is negative for a community; item_id is the post or object ID.
Inputs: type (required), item_id (required), count, offset, +2 more. Returns: count, items, pagination
vk_messages_get_conversationsList community conversationsARead-onlyIdempotent
List the conversations in your community's inbox, newest first, with the last message of each and the names of the people in them. Use filter "unread" to see what is waiting for a reply. Needs a community token with the messages right.
Inputs: count, filter, offset. Returns: count, items, pagination
vk_messages_get_historyRead a conversationARead-onlyIdempotent
Read the messages of one conversation in your community's inbox, newest first. peer_id is the person's user ID, as vk_messages_get_conversations shows it. Needs a community token with the messages right.
Inputs: peer_id (required), count, offset. Returns: count, items, pagination
vk_messages_mark_as_readMark a conversation as readAIdempotent
Mark every message in one conversation of your community's inbox as read, e.g. after answering it.
Inputs: peer_id (required). Returns: success
vk_messages_sendReply as the communityA
Send a message from your community to a person. VK only delivers to people who have written to the community or allowed it to message them. This reaches a real person: show the user the text before sending. Returns the new message_id.
Inputs: message (required), peer_id (required), reply_to, attachment. Returns: message_id
vk_newsfeed_getRead your newsfeedARead-onlyIdempotent
Read the token owner's own newsfeed. Needs a user token — this is the feed of the account the token belongs to, not a public one.
Inputs: count, filters, start_from. Returns: count, items, pagination
vk_photos_getGet photosARead-onlyIdempotent
List photos from an album. album_id accepts wall, profile or saved as well as a numeric album ID. owner_id is negative for a community.
Inputs: count, album_id, owner_id. Returns: count, items, pagination
vk_photos_upload_wallUpload a photo for a postA
Upload a photo so it can be attached to a post. Takes a URL or a local file path, runs VK's three-step upload, and returns an attachment string like photo-1_2 to pass to vk_wall_post or vk_wall_edit. group_id is positive here, without the minus sign. Needs a full user token: VK refuses a community token here (error 27), and has no other way for one to attach a photo to a post.
Inputs: image (required), caption, group_id. Returns: id, owner_id, attachment
vk_stats_getCommunity statisticsARead-onlyIdempotent
Read a community's statistics by period: reach, visitors and activity. The token owner must be an administrator of that community, otherwise VK denies access.
Inputs: group_id (required), interval, intervals_count. Returns: count, items, pagination
vk_stories_post_photoPublish a photo storyA
Publish a photo story on VK (three-step upload: get upload server, upload the photo, save). Posts a personal story, or a community one when group_id is set.
Inputs: image (required), group_id, link_url, link_text, +1 more. Returns: count, items, pagination
vk_stories_post_videoPublish a video storyA
Publish a video story on VK (three-step upload: get upload server, upload the video, save). Posts a personal story, or a community one when group_id is set.
Inputs: video (required), group_id, link_url, link_text, +1 more. Returns: count, items, pagination
vk_users_getGet user profilesARead-onlyIdempotent
Look up VK users by numeric ID or short name (e.g. durov). Use this to resolve a name to an ID before calling other tools, or to check whether a profile is closed.
Inputs: fields, user_ids. Returns: count, items, pagination
vk_users_searchSearch usersARead-onlyIdempotent
Find VK users by name, optionally narrowed by city, country, sex or age. Returns matches with a total count; page through them with offset.
Inputs: q (required), sex, city, count, +5 more. Returns: count, items, pagination
vk_wall_create_commentComment on a postA
Add a comment to a post. owner_id is negative for a community. Returns the new comment_id.
Inputs: message (required), post_id (required), owner_id (required). Returns: comment_id
vk_wall_deleteDelete a postADestructive
Delete a post from a wall. owner_id is negative for a community. This cannot be undone.
Inputs: post_id (required), owner_id. Returns: success
vk_wall_editEdit a postADestructive
Replace the text or attachments of an existing post. owner_id is negative for a community. Editing overwrites the previous content, so pass the full new text rather than an addition.
Inputs: post_id (required), message, owner_id, attachments. Returns: success
vk_wall_getRead a wallARead-onlyIdempotent
Read posts from a user or community wall, newest first. Pass domain for a short address (durov) or owner_id for a numeric one — negative for a community, positive for a person. Each post carries its likes, reposts, comments and views.
Inputs: count, domain, filter, offset, +1 more. Returns: count, items, pagination
vk_wall_get_by_idGet specific postsARead-onlyIdempotent
Fetch particular posts by their full IDs in {owner_id}_{post_id} form, e.g. -1_340393. Use it to re-read a post you already know about, such as one you just published.
Inputs: posts (required), fields. Returns: count, items, pagination
vk_wall_postPublish a postA
Publish a post on a wall. To post in a community, set owner_id to the community ID with a minus sign (-123) and from_group true, otherwise it appears as your personal post on the community wall. Attach media with the attachment string that vk_photos_upload_wall returns. Returns the new post_id.
Inputs: message (required), guid, owner_id, from_group, +2 more. Returns: post_id
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 25 tools
Most tools have clearly distinct resource+action purposes. The main ambiguity comes from pairs like vk_wall_get vs vk_wall_get_by_id and vk_groups_get vs vk_groups_get_by_id, where the names alone may cause momentary confusion, though descriptions clarify the difference.
All tools follow a consistent vk_<resource>_<action> snake_case pattern. Minor variations like mark_as_read or get_by_id are still fully predictable within that scheme.
25 tools is at the upper boundary of what feels appropriate for a single MCP server. The tools are meaningful, but the set is heavy and spans many VK domains, risking cognitive overload for an agent.
Core workflows like reading/posting wall content and messaging are covered, but notable lifecycle gaps exist: no delete for messages/photos/stories, no like/unlike actions, no comment editing or deletion, and no friend add/remove or group leave. These omissions limit agents on common VK tasks.
Maintenance
Related MCP Connectors
Model Context Protocol server for todo.vu task management and time tracking.
Model Context Protocol server for Studex tools, notifications, and profile integrations
A Model Context Protocol server for Wix AI tools
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Related MCP Servers
- -
- -
- AlicenseAqualityDmaintenanceKaspersky OpenTIP Model Context Protocol Server. This server gives access to Kaspersky OpenTIP API to agentic applications.626Apache 2.0
- AlicenseNot gradedqualityBmaintenanceModel Context Protocol server for BusinessMap (Kanbanize) integration. Provides comprehensive access to BusinessMap's project management features including workspaces, boards, cards, subtasks, parent-child relationships, outcomes, custom fields, and more.904 npm12MIT