Skip to main content
Glama
tachote
by tachote

poll_interactsh_session

Retrieve and decrypt security testing interactions for a session, with optional filters for HTTP method, path, query, protocol, or text content.

Instructions

Retrieves and decrypts interactions for a session. Optional filters let you match HTTP method, path, query, protocol, or free text.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
correlation_idYes
methodNo
path_containsNo
query_containsNo
protocolNo
text_containsNo

Implementation Reference

  • src/server.js:342-375 (registration)
    Registration of the 'poll_interactsh_session' MCP tool, defining metadata, Zod inputSchema, and inline handler function that delegates to service.pollSession and applies filters.
    server.registerTool(
      'poll_interactsh_session',
      {
        title: 'Poll session',
        description:
          'Retrieves and decrypts interactions for a session. Optional filters let you match HTTP method, path, query, protocol, or free text.',
        inputSchema: {
          correlation_id: z.string(),
          method: z.string().optional(),
          path_contains: z.string().optional(),
          query_contains: z.string().optional(),
          protocol: z.string().optional(),
          text_contains: z.string().optional(),
        },
      },
      async ({ correlation_id, ...filters }) => {
        const payload = await service.pollSession(correlation_id);
        const sanitizedFilters = Object.fromEntries(
          Object.entries(filters)
            .filter(([, value]) => value !== undefined && value !== '')
            .map(([key, value]) => [key, typeof value === 'string' ? value : JSON.stringify(value)]),
        );
        const filteredEvents = applyEventFilters(payload.events, sanitizedFilters);
    
        return result({
          applied_filters: sanitizedFilters,
          total_events: payload.events.length,
          matched_events: filteredEvents.length,
          events: filteredEvents,
          extra: payload.extra,
          tld_data: payload.tld_data,
        });
      },
    );
  • Zod input schema for the tool: requires correlation_id, optional filter fields (method, path_contains, query_contains, protocol, text_contains).
    inputSchema: {
      correlation_id: z.string(),
      method: z.string().optional(),
      path_contains: z.string().optional(),
      query_contains: z.string().optional(),
      protocol: z.string().optional(),
      text_contains: z.string().optional(),
    },
  • Inline MCP tool handler: calls service.pollSession, sanitizes and applies filters to events, returns structured content with counts and filtered results.
    async ({ correlation_id, ...filters }) => {
      const payload = await service.pollSession(correlation_id);
      const sanitizedFilters = Object.fromEntries(
        Object.entries(filters)
          .filter(([, value]) => value !== undefined && value !== '')
          .map(([key, value]) => [key, typeof value === 'string' ? value : JSON.stringify(value)]),
      );
      const filteredEvents = applyEventFilters(payload.events, sanitizedFilters);
    
      return result({
        applied_filters: sanitizedFilters,
        total_events: payload.events.length,
        matched_events: filteredEvents.length,
        events: filteredEvents,
        extra: payload.extra,
        tld_data: payload.tld_data,
      });
    },
  • Core InteractshService.pollSession method: authenticates and GET /poll endpoint, decrypts events using session's private key, normalizes extra/tld_data.
    async pollSession(correlationId) {
      const session = this.#requireSession(correlationId);
      const url = new URL('/poll', this.baseUrl);
      url.searchParams.set('id', session.correlationId);
      url.searchParams.set('secret', session.secretKey);
    
      const response = await this.#request(url, { method: 'GET' });
      const payload = await response.json();
    
      const events = this.#decryptEvents(session.privateKey, payload);
      return {
        events,
        extra: normaliseArray(payload.extra),
        tld_data: normaliseArray(payload.tlddata),
      };
    }
  • Helper function to filter decrypted events by HTTP method, protocol, path/query contains, or free-text search across raw/parsed data.
    function applyEventFilters(events, filters) {
      if (!events.length) {
        return [];
      }
    
      const methodFilter = filters.method ? filters.method.toUpperCase() : undefined;
      const protocolFilter = filters.protocol ? filters.protocol.toLowerCase() : undefined;
      const pathFilter = filters.path_contains ? filters.path_contains.toLowerCase() : undefined;
      const queryFilter = filters.query_contains ? filters.query_contains.toLowerCase() : undefined;
      const textFilter = filters.text_contains ? filters.text_contains.toLowerCase() : undefined;
    
      return events
        .map((raw) => {
          const parsed = parseEvent(raw);
          return { raw, ...parsed };
        })
        .filter(({ raw, parsed, http, protocol }) => {
          if (methodFilter && (!http || http.method !== methodFilter)) {
            return false;
          }
          if (pathFilter && (!http || !http.pathLower.includes(pathFilter))) {
            return false;
          }
          if (queryFilter && (!http || !http.queryLower.includes(queryFilter))) {
            return false;
          }
          if (protocolFilter && (!protocol || protocol.toLowerCase() !== protocolFilter)) {
            return false;
          }
          if (textFilter) {
            const haystack = [raw, parsed ? JSON.stringify(parsed) : '', http?.fullPath ?? '']
              .join(' ')
              .toLowerCase();
            if (!haystack.includes(textFilter)) {
              return false;
            }
          }
          return true;
        })
        .map(({ raw, parsed, http, protocol }) => ({
          raw,
          protocol: protocol ?? undefined,
          http: http ?? undefined,
          parsed: parsed ?? undefined,
        }));
    }

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/tachote/mcp-interactsh'

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