היסטוריה חדשה

MCP האחרון שלך לתזמן את כל הפוסטים החברתיים שלך!

על ידי Nevo David8m2025/04/15
Read on Terminal Reader

יותר מדי זמן; לקרוא

Postiz הוא אפליקציה המאפשרת לך לתזמן את כל ההודעות החברתיות שלך מתוך צ'אט אחד.היא נבנתה עם NestJS, כך שכאשר אתה משתמש במסלול SSE, היא סוגרת את התצפית ברגע שהיא מתנתקת, ומאפשרת לך להסיר הכל מהזיכרון.
featured image - MCP האחרון שלך לתזמן את כל הפוסטים החברתיים שלך!
Nevo David HackerNoon profile picture

אני די מכור לסדרה Last Of Us. Sorry about the cover.


😉 MCPs נמצאים בכל מקום מסיבה טובה.זה הצעד הבא בהתפתחות היישומים.


Being able to use everything from a single chat without accessing any app. It feels native for Postiz to schedule all your social posts from the chat! So, I started to dig into the Postiz code and added to it!

Postiz


MCPE

MCPEMCPE» HR

The MCP Repository Is a Bit Weird

כל MCP יש תחבורה, שהיא השיטה שבה LLMs להשתמש כדי לדבר עם המערכת שלנו.


יש שתי שיטות עיקריות כרגע: Stdio, שהוא בעצם שורת פקודות, ו- SSE.

יש שתי שיטות עיקריות כרגע


אני לא ממש מבין למה הם בחרו ב- SSE – זה בעצם בקשה ארוכה שאינה נגמרת ומעבירה אירועים לקוח.


הבעיה עם שיטה זו היא כי כדי לשלוח מידע בחזרה לשרת, עליך לשלוח בקשה דואר נוספת (כי SSE היא תקשורת חד-צדדית), כלומר עליך לשמור על המצב.



בדוגמה שלהם, הם מחזיקים את המצב בזיכרון של האפליקציה, ונחשו מה?


אני הייתי משתמש WebSockets. יש להם מצב שינה מובנה, ואתה לא צריך לשמור על מצב עבור זה.

» HR

התייחסות ל

חפצתי ב-Anthropic typcript SDK ולא הופתעתי. זה מרגיש מגוחך. דברים רבים אינם בשימוש בייצור, כגון "משאבים".


כמו כן, קשה ליישם אימות ולהוציא את המשתמש מהקשר כדי שנוכל לקבל את הפרטים שלהם.



Postiz נבנה עם NestJS, כך שכאשר אתה משתמש במסלול SSE, זה סוגר את המעקב ברגע שהוא מתנתק, ומאפשר לך להסיר הכל מהזיכרון.


import EventEmitter from 'events'; import {finalize, fromEvent, startWith } from 'rxjs'; @Injectable() export class McpService { static event = new EventEmitter(); constructor( private _mainMcp: MainMcp) { } async runServer(apiKey: string, organization: string) { const server = 'endpoint', data.envoice.load(organization, this._mainMcp).server(); const transport = new McpTransport(organization); const observer = fromEvent(McP: MainMcp.event), `transport-${McService.event), `transport_transport_P> (transport_transport_P>; transportimport EventEmitter from 'events';
import { finalize, fromEvent, startWith } from 'rxjs';

@Injectable()
export class McpService {
  static event = new EventEmitter();
  constructor(
    private _mainMcp: MainMcp
  ) {
  }

  async runServer(apiKey: string, organization: string) {
    const server = McpSettings.load(organization, this._mainMcp).server();
    const transport = new McpTransport(organization);

    const observer = fromEvent(
      McpService.event,
      `organization-${organization}`
    ).pipe(
      startWith({
        type: 'endpoint',
        data: process.env.NEXT_PUBLIC_BACKEND_URL + '/mcp/' + apiKey + '/messages',
      }),
      finalize(() => {
        transport.close();
      })
    );

    console.log('MCP transport started');
    await server.connect(transport);

    return observer;
  }

  async processPostBody(organization: string, body: object) {
    const server = McpSettings.load(organization, this._mainMcp).server();
    const message = JSONRPCMessageSchema.parse(body);
    const transport = new McpTransport(organization);
    await server.connect(transport);
    transport.handlePostMessage(message);
    return {};
  }
}

חבילות נופש ️

זה בשבילך אם אתה מעריץ גדול של מסגרות OOP כמו NestJS/Laravel/Spring.[[מקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המקור: המ @McpTool({ toolName: 'POSTIZ_GET_CONFIG_ID' }) async preRun() { return [ { type: 'text', text: `id: ${makeId(10)} Today date is ${dayjs.utc().format()}`, }, ]; } @McpTool({ toolName: 'POSTIZ_PROVIDERS_LIST' }) async listOfProviders(organization: string) { const list = ( await this._integrationService.getIntegrationsList(organization) ).map((org) => ({ id: org.id, name: org.name, identifier: org.providerIdentifier, picture: org.picture, disabled: org.disabled, profile: org.profile, customer: org.customer ? { id: org.customer.id, name: org.customer.name, } : undefined, })); return [{ type: 'text', text: JSON.stringify(list) }]; } @McpTool({ toolName: 'POSTIZ_SCHEDULE_POST', zod: { type: eenum(['draft', 'scheduled']), configId: string(), generatePictures: boolean(), date: string().describe('UTC TIME'), providerId: string().describe('Use POSTIZ_PROVIDERS_LIST to get the id'), posts: array(object({ text: string(), images: array(string()) })), }, }) async schedulePost( organization: string, obj: { type: 'draft' | 'schedule'; generatePictures: boolean; date: string; providerId: string; posts: { text: string }[]; } ) { const create = await this._postsService.createPost(organization, { date: obj.date, type: obj.type, tags: [], posts: [ { group: makeId(10), value: await Promise.all( obj.posts.map(async (post) => ({ content: post.text, id: makeId(10), image: !obj.generatePictures ? [] : [ { id: makeId(10), path: await this._openAiService.generateImage( post.text, true ), }, ], })) ), // @ts-ignore settings: {}, integration: { id: obj.providerId, }, }, ], }); return [ { type: 'text', text: `Post created successfully, check it here: ${process.env.FRONTEND_URL}/p/${create[0].postId}`, }, ]; }

All the code can be found in Postiz here: https://github.com/gitroomhq/postiz-app/tree/main/libraries/nestjs-libraries/src/mcp

https://github.com/gitroomhq/postiz-app/tree/main/libraries/nestjs-libraries/src/mcp


And here: https://github.com/gitroomhq/postiz-app/tree/main/apps/backend/src/mcp

https://github.com/gitroomhq/postiz-app/tree/main/apps/backend/src/mcp» HR

כוח LLM לעשות דברים 💪🏻

זה יהיה נחמד שיש אפשרות מובנית להכריח את LLM לעשות דברים שונים לפני שהוא מקבל גישה לדברים שלנו.


בכל פעם שאמרתי לקורסור לתזמן פוסט בשבילי, הוא ניסה לתזמן אותו לשנת 2024.


הייתי צריך להעביר כמה פרטים של הגדרות, אז יצרתי את הכלי POSTIZ_CONFIGURATION_PRERUN.POSTIZ_CONFIGURATION_PRERUN


ב POSTIZ_SCHEDULE_POST, הוספתי תכונה חדשה בשם configId ושיניתי את שם כלי ההגדרה ל POSTIZ_GET_CONFIG_ID. היציאה של ההגדרה היא:id: ${makeId(10)} תאריך היום הוא ${day.jsutc().format()}


POSTIZ_SCHEDULE_POSTconfigIdPOSTIZ_GET_CONFIG_ID.id: ${makeId(10)} Today date is ${dayjs.utc().format()}

זה הכריח את LLM תמיד להתקשר לזה קודם לכן, ואת התאריך נקבע! :)


זה היה אפילו יותר טוב בשבילי כי ידעתי שזה ישלח לי תאריכים UTC מעכשיו.

» HR

משתמשים

אני חושב שזה עובד הכי טוב כאשר הוא משולב עם מספר קבוצות של כלים, למשל:

  • Connect it to Cursor and ask it to schedule a post about your work today.
  • Connect it to Notion and ask to schedule all the team's latest work on social media - check out Composio MCPs.
  • Connect it to any SaaS that has CopilotKit and schedule posts based on the app.
  • חבר אותו ל- Cursor ולבקש ממנו לתזמן פוסט על העבודה שלך היום.
  • Connect it to Notion and ask to schedule all the team's latest work on social media - check out Composio MCPs.
  • Composio MCPs
  • Connect it to any SaaS that has CopilotKit and schedule posts based on the app.
  • CopilotKit» HR

    Postiz MCP

    Postiz is the most robust open-source social media scheduling tool - and now the only scheduler that offers MCP (natively, not with Zapier or something like that)

    Postiz


    עם MCP החדש, תוכל לתזמן את כל הפוסטים שלך מ- Cursor/Windsurf ו- Anthropic clients.


    כל זה 100% בחינם כמובן. :)


    If you like it, please don't forget to star us ⭐️https://github.com/gitroomhq/postiz-app
    OG

    https://github.com/gitroomhq/postiz-app
    OG
    » BROG

    Trending Topics

    blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks