Skip to main content
Glama
Jing-yilin

LinkedIn MCP Server

by Jing-yilin

get_company_posts

Retrieve and clean posts from LinkedIn company pages to analyze content, monitor updates, or gather business intelligence.

Instructions

Get posts from a LinkedIn company page. Returns cleaned data in TOON format.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
companyNoLinkedIn company URL
companyIdNoLinkedIn company ID (faster)
companyUniversalNameNoCompany universal name
postedLimitNoFilter by time: 24h, week, month
pageNoPage number
paginationTokenNoPagination token
save_dirNoDirectory to save cleaned JSON data
max_itemsNoMaximum posts (default: 10)

Implementation Reference

  • Main handler function that executes the tool: constructs params from args, calls HarvestAPI /company-posts endpoint, cleans data using DataCleaners.cleanPost, limits results, and formats response in TOON with optional save.
    private async getCompanyPosts(args: Record<string, any>): Promise<CallToolResult> { const params: Record<string, any> = {}; if (args.company) params.company = args.company; if (args.companyId) params.companyId = args.companyId; if (args.companyUniversalName) params.companyUniversalName = args.companyUniversalName; if (args.postedLimit) params.postedLimit = args.postedLimit; if (args.page) params.page = args.page; if (args.paginationToken) params.paginationToken = args.paginationToken; if (!params.company && !params.companyId && !params.companyUniversalName) { throw new Error('At least one of company, companyId, or companyUniversalName is required'); } const data = await this.makeRequest('/company-posts', params); const maxItems = args.max_items || 10; const cleaned = (data.elements || []).slice(0, maxItems).map(DataCleaners.cleanPost); return this.formatResponse(cleaned, { saveDir: args.save_dir, toolName: 'get_company_posts', pagination: data.pagination, }); }
  • src/index.ts:360-377 (registration)
    Tool registration in ListToolsRequestHandler: defines name, description, and input schema for validation.
    { name: 'get_company_posts', description: 'Get posts from a LinkedIn company page. Returns cleaned data in TOON format.', inputSchema: { type: 'object', properties: { company: { type: 'string', description: 'LinkedIn company URL' }, companyId: { type: 'string', description: 'LinkedIn company ID (faster)' }, companyUniversalName: { type: 'string', description: 'Company universal name' }, postedLimit: { type: 'string', description: 'Filter by time: 24h, week, month', enum: ['24h', 'week', 'month'] }, page: { type: 'integer', description: 'Page number', default: 1 }, paginationToken: { type: 'string', description: 'Pagination token' }, save_dir: { type: 'string', description: 'Directory to save cleaned JSON data' }, max_items: { type: 'integer', description: 'Maximum posts (default: 10)', default: 10 }, }, required: [], }, } as Tool,
  • src/index.ts:541-541 (registration)
    Switch case in CallToolRequestHandler that routes tool calls to the getCompanyPosts handler method.
    case 'get_company_posts': return await this.getCompanyPosts(args as Record<string, any>);
  • Data cleaning utility specifically for post objects, used to process raw API responses into structured format.
    cleanPost(raw: any): any { if (!raw) return null; return { id: raw.id, linkedinUrl: raw.linkedinUrl, content: raw.content, authorName: raw.author?.name, authorType: raw.author?.type, postedAgo: raw.postedAt?.postedAgoText || raw.postedAt?.postedAgoShort, likes: raw.engagement?.likes, comments: raw.engagement?.comments, shares: raw.engagement?.shares, hasVideo: !!raw.postVideo, hasImages: (raw.postImages?.length || 0) > 0, }; },

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/Jing-yilin/linkedin-mcp-server'

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