# io.github.bulatko/vk (npm · vk-mcp-server)

VK (VKontakte): read walls, users, communities and stats; publish, edit and comment on posts.

- Trust score: 76/100 (medium)
- Change this week: +30
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `vk-mcp-server`: 76/100 (this document), [markdown](https://verifymcp.io/servers/bulatko-vk/vk-mcp-server.md), [page](https://verifymcp.io/servers/bulatko-vk/vk-mcp-server)

## Channel facts

- Registry: `npm`
- Package: `vk-mcp-server`
- Version: `0.6.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 86/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (94 of 98), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (94 of 98), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 71/100
  - Repository check failed: the declared repository URL redirects; it must resolve directly.
  - Cryptographically verified build provenance (signed, bound to bulatko/vk-mcp-server).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 7 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 83/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 2214 tokens (~110/item across 20 items; 19 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 99/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 97% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
  - Supports UI / widget rendering.

## Install

### Claude

```bash
claude mcp add bulatko-vk -- npx -y vk-mcp-server
```

### Codex

```bash
codex mcp add bulatko-vk -- npx -y vk-mcp-server
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "bulatko-vk": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "vk-mcp-server"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add bulatko-vk --command npx --arg -y --arg vk-mcp-server
```

### Hermes

```yaml
mcp_servers:
  bulatko-vk:
    command: "npx"
    args: ["-y", "vk-mcp-server"]
```

### Other

```json
{
  "mcpServers": {
    "bulatko-vk": {
      "command": "npx",
      "args": [
        "-y",
        "vk-mcp-server"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-02 (score 75, +25)

- [security regression] Install scripts: pass → unverified
- [security regression] Provenance: pass → unverified
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] The attested source repository moved: bulatko/vk-mcp-server
- [functional regression] Maintenance: pass → unverified
- [functional regression] License: pass → unverified
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Stability: unverified → 0.23
- [functional] Licence: MIT

### 2026-07-31 (score 50, +28)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 22, −66)

- [security regression] Known CVEs: partial → unverified
- [security regression] Malware scan: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional regression] Dependency health: partial → unverified

### 2026-07-29 (score 88, +69)

- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Provenance: unverified → pass
- [security] The attested source repository moved: bulatko/vk-mcp-server
- [functional improvement] Schema quality: unverified → good
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Schema quality: unverified → 100
- [functional improvement] License: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional] Licence: MIT

### 2026-07-28 (score 19, −27)

- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional improvement] Dependency health: unverified → partial

### 2026-07-27 (score 46)

First indexed and scored.

## MCP tools (19)

### `vk_users_get` (~76 tokens)

Get user profiles

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.

Input parameters:

- `fields` (string): Profile fields to return
- `user_ids` (string): Comma-separated user IDs or screen names

Output parameters:

- `count` (number): Total number of matches on VK, which is usually larger than the returned page
- `items` (array): User profiles
- `pagination` (object): Where this page sits in the whole result. Call the tool again with offset set to next_offset to continue; when next_offset is null there is nothing left to fetch.

### `vk_users_search` (~152 tokens)

Search users

Find VK users by name, optionally narrowed by city, country, sex or age. Returns matches with a total count; page through them with offset.

Input parameters:

- `age_from` (number): Minimum age
- `age_to` (number): Maximum age
- `city` (number): City ID to filter by
- `count` (number): Number of results (max 1000)
- `country` (number): Country ID to filter by
- `fields` (string): Additional profile fields to return
- `offset` (number): Offset for pagination
- `q` (string, required): Search query (name or keywords)
- `sex` (number): Sex filter: 1 — female, 2 — male

Output parameters:

- `count` (number): Total number of matches on VK, which is usually larger than the returned page
- `items` (array): Matching user profiles
- `pagination` (object): Where this page sits in the whole result. Call the tool again with offset set to next_offset to continue; when next_offset is null there is nothing left to fetch.

### `vk_wall_get` (~132 tokens)

Read a wall

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.

Input parameters:

- `count` (number): Number of posts (1-100)
- `domain` (string): Short address of user or community
- `filter` (string): Filter: all, owner, others, postponed, suggests
- `offset` (number): Offset for pagination
- `owner_id` (number): Wall owner ID (negative for community)

Output parameters:

- `count` (number): Total number of matches on VK, which is usually larger than the returned page
- `items` (array): Wall posts, newest first
- `pagination` (object): Where this page sits in the whole result. Call the tool again with offset set to next_offset to continue; when next_offset is null there is nothing left to fetch.

### `vk_wall_post` (~182 tokens)

Publish a post

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.

Input parameters:

- `attachments` (string): Comma-separated attachments (e.g. photo123_456,link)
- `from_group` (boolean): Post on behalf of community
- `guid` (string): Unique identifier to prevent duplicate posts
- `message` (string, required): Post text content
- `owner_id` (number): Wall owner: a community as a negative number (-123), a person as a positive one. Defaults to the token owner.
- `publish_date` (number): Unix timestamp for scheduled post (must be within 2 weeks)

Output parameters:

- `post_id` (number): ID of the published post

### `vk_wall_create_comment` (~82 tokens)

Comment on a post

Add a comment to a post. owner_id is negative for a community. Returns the new comment_id.

Input parameters:

- `message` (string, required): Comment text
- `owner_id` (number, required): Wall owner: a community as a negative number (-123), a person as a positive one. Defaults to the token owner.
- `post_id` (number, required): Post ID

Output parameters:

- `comment_id` (number): ID of the created comment

### `vk_wall_get_by_id` (~97 tokens)

Get specific posts

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.

Input parameters:

- `fields` (string): Additional profile fields to return
- `posts` (string, required): Comma-separated post IDs in format {owner_id}_{post_id} (e.g. -123_456)

Output parameters:

- `count` (number): Total number of matches on VK, which is usually larger than the returned page
- `items` (array): The requested posts
- `pagination` (object): Where this page sits in the whole result. Call the tool again with offset set to next_offset to continue; when next_offset is null there is nothing left to fetch.

### `vk_wall_edit` (~110 tokens)

Edit a post

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.

Input parameters:

- `attachments` (string): Comma-separated attachments
- `message` (string): New post text
- `owner_id` (number): Wall owner: a community as a negative number (-123), a person as a positive one. Defaults to the token owner.
- `post_id` (number, required): Post ID to edit

Output parameters:

- `success` (boolean): Whether VK accepted the change

### `vk_wall_delete` (~73 tokens)

Delete a post

Delete a post from a wall. owner_id is negative for a community. This cannot be undone.

Input parameters:

- `owner_id` (number): Wall owner: a community as a negative number (-123), a person as a positive one. Defaults to the token owner.
- `post_id` (number, required): Post ID to delete

Output parameters:

- `success` (boolean): Whether VK accepted the change

### `vk_photos_upload_wall` (~141 tokens)

Upload a photo for a post

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.

Input parameters:

- `caption` (string): Photo caption
- `group_id` (string): Community ID or its short name (e.g. apiclub). Positive and without the minus sign — the minus belongs to owner_id on a wall, not here.
- `image` (string, required): Image URL (http/https) or absolute local file path

Output parameters:

- `attachment` (string): Attachment string such as photo-1_2, ready to pass to vk_wall_post
- `id` (number): Photo ID
- `owner_id` (number): Owner of the uploaded photo

### `vk_groups_search` (~163 tokens)

Search communities

Find communities by keyword, optionally narrowed by type, country, city or sort order. Returns matches with a total count.

Input parameters:

- `city_id` (number): City ID to filter by
- `count` (number): Number of results (max 1000)
- `country_id` (number): Country ID to filter by
- `fields` (string): Additional community fields to return
- `future` (number): Filter future events: 1 — only future events
- `offset` (number): Offset for pagination
- `q` (string, required): Search query
- `sort` (number): Sort order: 0 — default, 1 — by speed, 6 — by likes
- `type` (string): Community type: group, page or event

Output parameters:

- `count` (number): Total number of matches on VK, which is usually larger than the returned page
- `items` (array): Matching communities
- `pagination` (object): Where this page sits in the whole result. Call the tool again with offset set to next_offset to continue; when next_offset is null there is nothing left to fetch.

### `vk_groups_get_members` (~190 tokens)

List community members

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.

Input parameters:

- `count` (number): Number of members to return (max 1000)
- `fields` (string): Additional profile fields to return (e.g. photo_200,online,sex,city)
- `filter` (string): Filter: managers, editors, mods, advertisers, friends, unsure
- `group_id` (string, required): Community ID or its short name (e.g. apiclub). Positive and without the minus sign — the minus belongs to owner_id on a wall, not here.
- `offset` (number): Offset for pagination
- `sort` (string): Sort order: id_asc, id_desc, time_asc, time_desc

Output parameters:

- `count` (number): Total number of matches on VK, which is usually larger than the returned page
- `items` (array): Member IDs, or profiles when fields are requested
- `pagination` (object): Where this page sits in the whole result. Call the tool again with offset set to next_offset to continue; when next_offset is null there is nothing left to fetch.

### `vk_groups_join` (~103 tokens)

Join a community

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.

Input parameters:

- `group_id` (string, required): Community ID or its short name (e.g. apiclub). Positive and without the minus sign — the minus belongs to owner_id on a wall, not here.
- `not_sure` (number): For events only: 1 — "maybe attending", 0 — confirmed

Output parameters:

- `success` (boolean): Whether VK accepted the change

### `vk_groups_get` (~77 tokens)

List your communities

List the communities the token owner belongs to. Needs a user token — a community or service token cannot answer this.

Input parameters:

- `count` (number): Number of communities
- `fields` (string): Community fields
- `filter` (string): Filter by type
- `user_id` (number): User ID. Defaults to the token owner.

Output parameters:

- `count` (number): Total number of matches on VK, which is usually larger than the returned page
- `items` (array): Communities the user belongs to
- `pagination` (object): Where this page sits in the whole result. Call the tool again with offset set to next_offset to continue; when next_offset is null there is nothing left to fetch.

### `vk_groups_get_by_id` (~97 tokens)

Get community info

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.

Input parameters:

- `fields` (string): Community fields
- `group_ids` (string): Comma-separated community IDs or short names (e.g. apiclub,vk). Positive and without the minus sign.

Output parameters:

- `groups` (array): Community profiles

### `vk_friends_get` (~82 tokens)

List friends

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.

Input parameters:

- `count` (number): Number of friends
- `fields` (string): Profile fields
- `order` (string)
- `user_id` (number): User ID. Defaults to the token owner.

Output parameters:

- `count` (number): Total number of matches on VK, which is usually larger than the returned page
- `items` (array): Friend IDs, or profiles when fields are requested
- `pagination` (object): Where this page sits in the whole result. Call the tool again with offset set to next_offset to continue; when next_offset is null there is nothing left to fetch.

### `vk_newsfeed_get` (~76 tokens)

Read your newsfeed

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.

Input parameters:

- `count` (number): Number of items
- `filters` (string): Filter by type: post, photo, video
- `start_from` (string): Pagination cursor

Output parameters:

- `count` (number): Total number of matches on VK, which is usually larger than the returned page
- `items` (array): Newsfeed entries
- `pagination` (object): Where this page sits in the whole result. Call the tool again with offset set to next_offset to continue; when next_offset is null there is nothing left to fetch.

### `vk_stats_get` (~98 tokens)

Community statistics

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.

Input parameters:

- `group_id` (string, required): Community ID or its short name (e.g. apiclub). Positive and without the minus sign — the minus belongs to owner_id on a wall, not here.
- `interval` (string)
- `intervals_count` (number): Number of intervals

Output parameters:

- `count` (number): Total number of matches on VK, which is usually larger than the returned page
- `items` (array): One entry per statistics period
- `pagination` (object): Where this page sits in the whole result. Call the tool again with offset set to next_offset to continue; when next_offset is null there is nothing left to fetch.

### `vk_likes_get` (~166 tokens)

See who reacted

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.

Input parameters:

- `count` (number): Number of users to return (max 1000)
- `item_id` (number, required): Object ID
- `offset` (number): Offset for pagination
- `owner_id` (number): Owner ID of the object (negative for community)
- `reaction_id` (number): Filter by reaction: 0 — like ❤️, 1 — laugh 😂, 2 — wow 😮, 3 — admiration 🔥, 4 — angry 😡, 5 — sad 😢
- `type` (string, required): Object type

Output parameters:

- `count` (number): Total number of matches on VK, which is usually larger than the returned page
- `items` (array): Users who reacted to the object
- `pagination` (object): Where this page sits in the whole result. Call the tool again with offset set to next_offset to continue; when next_offset is null there is nothing left to fetch.

### `vk_photos_get` (~87 tokens)

Get photos

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.

Input parameters:

- `album_id` (string): Album ID or: wall, profile, saved
- `count` (number): Number of photos
- `owner_id` (number): Album owner: negative for a community, positive for a person.

Output parameters:

- `count` (number): Total number of matches on VK, which is usually larger than the returned page
- `items` (array): Photos in the album
- `pagination` (object): Where this page sits in the whole result. Call the tool again with offset set to next_offset to continue; when next_offset is null there is nothing left to fetch.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/bulatko-vk/vk-mcp-server#diagnostics

## Score history

- 2026-08-03: 76
- 2026-08-02: 75
- 2026-08-01: 50
- 2026-07-31: 50
- 2026-07-30: 22
- 2026-07-29: 88
- 2026-07-28: 19
- 2026-07-27: 46

## Links

- npm package: https://www.npmjs.com/package/vk-mcp-server
- Socket report: https://socket.dev/npm/package/vk-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/bulatko-vk/vk-mcp-server/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/bulatko-vk/vk-mcp-server/changelog.json
- HTML version of this page: https://verifymcp.io/servers/bulatko-vk/vk-mcp-server
