Skip to main content
Glama
oathe-ai
by oathe-ai

submit_audit

Submit third-party AI skills for behavioral security audits before installation. Accepts GitHub or ClawHub URLs to analyze trust scores and returns an audit ID for tracking progress.

Instructions

Submit a third-party skill for a behavioral security audit before installing it. Accepts any GitHub or ClawHub URL. Returns an audit_id to track progress. Rate limited: one submission per 60 seconds per IP. Returns existing audit_id if URL was already scanned (deduplicated: true). Use check_audit_status to poll for results.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
skill_urlYesGitHub or ClawHub URL of the skill/repo to audit
notification_emailNoOptional email to notify when audit completes
force_rescanNoBypass deduplication and force a fresh audit

Implementation Reference

  • The async handler function that executes the submit_audit tool logic. It constructs the request body with skill_url, optional notification_email and force_rescan, makes a POST request to /api/submit, handles rate limiting (429 errors), and returns the audit_id in the response.
    async ({ skill_url, notification_email, force_rescan }) => {
      try {
        const body: Record<string, unknown> = { skill_url };
        if (notification_email) {
          body.notification_email = notification_email;
        }
        if (force_rescan) {
          body.force_rescan = true;
        }
    
        const res = await apiFetch('/api/submit', {
          method: 'POST',
          body: JSON.stringify(body),
        });
    
        const data = (await res.json()) as SubmitResponse;
        return {
          content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }],
        };
      } catch (err) {
        if (err instanceof ApiError) {
          if (err.status === 429) {
            return {
              content: [
                {
                  type: 'text' as const,
                  text: 'Rate limited — wait 60 seconds before resubmitting.',
                },
              ],
              isError: true,
            };
          }
          return {
            content: [{ type: 'text' as const, text: err.message }],
            isError: true,
          };
        }
        throw err;
      }
    },
  • The registerSubmitAudit function that registers the submit_audit tool with the MCP server, including its description, input schema (Zod validation), and the handler function.
    export function registerSubmitAudit(server: McpServer): void {
      server.registerTool(
        'submit_audit',
        {
          description:
            'Submit a third-party skill for a behavioral security audit before installing it. ' +
            'Accepts any GitHub or ClawHub URL. Returns an audit_id to track progress. ' +
            'Rate limited: one submission per 60 seconds per IP. ' +
            'Returns existing audit_id if URL was already scanned (deduplicated: true). ' +
            'Use check_audit_status to poll for results.',
          inputSchema: {
            skill_url: z
              .string()
              .describe('GitHub or ClawHub URL of the skill/repo to audit'),
            notification_email: z
              .string()
              .email()
              .optional()
              .describe('Optional email to notify when audit completes'),
            force_rescan: z
              .boolean()
              .optional()
              .describe('Bypass deduplication and force a fresh audit'),
          },
        },
        async ({ skill_url, notification_email, force_rescan }) => {
          try {
            const body: Record<string, unknown> = { skill_url };
            if (notification_email) {
              body.notification_email = notification_email;
            }
            if (force_rescan) {
              body.force_rescan = true;
            }
    
            const res = await apiFetch('/api/submit', {
              method: 'POST',
              body: JSON.stringify(body),
            });
    
            const data = (await res.json()) as SubmitResponse;
            return {
              content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }],
            };
          } catch (err) {
            if (err instanceof ApiError) {
              if (err.status === 429) {
                return {
                  content: [
                    {
                      type: 'text' as const,
                      text: 'Rate limited — wait 60 seconds before resubmitting.',
                    },
                  ],
                  isError: true,
                };
              }
              return {
                content: [{ type: 'text' as const, text: err.message }],
                isError: true,
              };
            }
            throw err;
          }
        },
      );
    }
  • Input schema definition for submit_audit tool using Zod. Validates skill_url (required), notification_email (optional email), and force_rescan (optional boolean) parameters.
    inputSchema: {
      skill_url: z
        .string()
        .describe('GitHub or ClawHub URL of the skill/repo to audit'),
      notification_email: z
        .string()
        .email()
        .optional()
        .describe('Optional email to notify when audit completes'),
      force_rescan: z
        .boolean()
        .optional()
        .describe('Bypass deduplication and force a fresh audit'),
    },
  • TypeScript interface defining the SubmitResponse structure returned by the API, containing audit_id, optional queue_position, notification_email, and deduplicated fields.
    export interface SubmitResponse {
      audit_id: string;
      queue_position?: number;
      notification_email?: string;
      deduplicated?: boolean;
    }
  • src/index.ts:19-19 (registration)
    Registration call that invokes registerSubmitAudit to register the submit_audit tool with the MCP server instance.
    registerSubmitAudit(server);

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/oathe-ai/oathe-mcp'

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