Skip to main content
Glama
bulatko

vk-mcp-server

vk_photos_get

Retrieve photos from VKontakte albums using owner ID and album identifier to access user content.

Instructions

Get photos from albums

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
owner_idNoAlbum owner ID
album_idNoAlbum ID or: wall, profile, saved
countNoNumber of photos

Implementation Reference

  • Tool schema definition for vk_photos_get, including name, description, and inputSchema with properties for owner_id, album_id, and count
    {
      name: 'vk_photos_get',
      description: 'Get photos from albums',
      inputSchema: {
        type: 'object',
        properties: {
          owner_id: { type: 'number', description: 'Album owner ID' },
          album_id: { type: 'string', description: 'Album ID or: wall, profile, saved' },
          count: { type: 'number', description: 'Number of photos' },
        },
      },
    },
  • Handler case for vk_photos_get that calls vk.photosGet with args.owner_id, defaults album_id to 'wall', and defaults count to 50
    case 'vk_photos_get':
      result = await vk.photosGet({
        owner_id: args.owner_id,
        album_id: args.album_id || 'wall',
        count: args.count || 50,
      });
      break;
  • VKClient.photosGet method that wraps the API call to VK's photos.get endpoint
    photosGet(params) { return this.call('photos.get', params); }
  • handleToolCall function containing the switch statement that routes tool names to their respective handlers
    async function handleToolCall(name, args) {
      try {
        let result;
    
        switch (name) {
          case 'vk_users_get':
            result = await vk.usersGet({
              user_ids: args.user_ids,
              fields: args.fields || 'photo_200,online,status',
            });
            break;
    
          case 'vk_wall_get':
            result = await vk.wallGet({
              owner_id: args.owner_id,
              domain: args.domain,
              count: args.count || 20,
              offset: args.offset,
            });
            break;
    
          case 'vk_wall_post':
            result = await vk.wallPost({
              owner_id: args.owner_id,
              message: args.message,
              from_group: args.from_group ? 1 : 0,
            });
            break;
    
          case 'vk_wall_create_comment':
            result = await vk.wallCreateComment({
              owner_id: args.owner_id,
              post_id: args.post_id,
              message: args.message,
            });
            break;
    
          case 'vk_groups_get':
            result = await vk.groupsGet({
              user_id: args.user_id,
              filter: args.filter,
              fields: args.fields || 'description,members_count',
              count: args.count || 100,
            });
            break;
    
          case 'vk_groups_get_by_id':
            result = await vk.groupsGetById({
              group_ids: args.group_ids,
              fields: args.fields || 'description,members_count',
            });
            break;
    
          case 'vk_friends_get':
            result = await vk.friendsGet({
              user_id: args.user_id,
              order: args.order,
              fields: args.fields || 'photo_200,online',
              count: args.count || 100,
            });
            break;
    
          case 'vk_newsfeed_get':
            result = await vk.newsfeedGet({
              filters: args.filters || 'post',
              count: args.count || 20,
              start_from: args.start_from,
            });
            break;
    
          case 'vk_stats_get':
            result = await vk.statsGet({
              group_id: args.group_id,
              interval: args.interval || 'day',
              intervals_count: args.intervals_count || 7,
            });
            break;
    
          case 'vk_photos_get':
            result = await vk.photosGet({
              owner_id: args.owner_id,
              album_id: args.album_id || 'wall',
              count: args.count || 50,
            });
            break;
    
          default:
            throw new Error(`Unknown tool: ${name}`);
        }
    
        return JSON.stringify(result, null, 2);
      } catch (error) {
        return JSON.stringify({ error: error.message });
      }
    }
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. 'Get photos from albums' implies a read-only operation, but it doesn't disclose important behavioral traits like authentication requirements, rate limits, pagination behavior (the 'count' parameter suggests some pagination but isn't explained), error conditions, or what format the photos are returned in. The description provides minimal behavioral context beyond the basic operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at just three words, which is efficient and front-loaded. However, this brevity comes at the cost of completeness - while there's no wasted language, the description may be too terse given the lack of annotations and output schema. Every word earns its place, but more words might be needed for adequate tool understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a photo retrieval tool with 3 parameters, no annotations, and no output schema, the description is insufficiently complete. The agent needs to understand what 'Get' actually returns (photo metadata, URLs, full objects?), how the 'album_id' special values ('wall', 'profile', 'saved') work, and authentication/rate limiting considerations. The description doesn't compensate for the missing structured information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters with clear descriptions. The description adds no additional parameter semantics beyond what's in the schema - it doesn't explain parameter relationships, provide examples, or clarify edge cases. The baseline score of 3 is appropriate when the schema does the heavy lifting for parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Get photos from albums' clearly states the verb ('Get') and resource ('photos from albums'), making the basic purpose understandable. However, it doesn't differentiate this tool from potential sibling photo-related tools (none are listed, but the generic phrasing doesn't help distinguish it from other possible photo retrieval methods). The purpose is clear but lacks specificity about scope or differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. There are no explicit instructions about when this tool is appropriate, when it should not be used, or what other tools might serve similar purposes. The agent must infer usage purely from the tool name and parameters without any contextual guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/bulatko/vk-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server