Skip to main content
Glama

smartthinking

Analyze and link thoughts using a graph-based reasoning framework. Improve logical connections, request suggestions, and generate visualizations for enhanced decision-making and cognitive clarity.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
connectionsNoConnexions à d'autres pensées - Permet de lier cette pensée à d'autres pensées du graphe
containsCalculationsNoIndique si la pensée contient des calculs à vérifier
generateVisualizationNoGénérer une visualisation du graphe de pensée
helpNoAfficher le guide d'utilisation complet
requestSuggestionsNoDemander des suggestions d'amélioration du raisonnement
requestVerificationNoDemander explicitement une vérification des informations
sessionIdNoIdentifiant de session pour maintenir l'état entre les appels
suggestToolsNoSuggérer des outils MCP pertinents pour cette étape du raisonnement
thoughtYesLe contenu de la pensée à analyser - PARAMÈTRE OBLIGATOIRE - Cette pensée sera ajoutée au graphe de raisonnement
thoughtTypeNoType de pensée dans le graphe de raisonnement - Détermine la fonction de cette penséeregular
userIdNoIdentifiant de l'utilisateur pour la personnalisation
visualizationOptionsNoOptions avancées pour la visualisation
visualizationTypeNoType de visualisation à générergraph

Implementation Reference

  • Core orchestrator that executes the main logic of the smartthinking tool: manages reasoning steps, thought graph, evaluation, verification, memory, visualization, and returns structured response.
    public async run(params: SmartThinkingParams): Promise<{ response: SmartThinkingResponse; sessionId: string; thoughtGraph: ThoughtGraph }>
    {
      const tracker = new ReasoningStepTracker();
      const sessionInitializationStep = tracker.start('context', 'Initialisation', 'Préparation de la session de raisonnement');
      const sessionId = params.sessionId || uuidv4();
      tracker.complete(sessionInitializationStep, { sessionId });
    
      const thoughtGraph = new ThoughtGraph(sessionId, this.deps.similarityEngine, this.deps.qualityEvaluator);
    
      const loadStep = tracker.start('context', 'Chargement du graphe', 'Récupération de l’état précédent');
      const previousState = await this.deps.memoryManager.loadGraphState(sessionId);
      if (previousState) {
        const imported = thoughtGraph.importEnrichedGraph(previousState);
        tracker.complete(loadStep, { imported, nodeCount: thoughtGraph.getAllThoughts(sessionId).length });
      } else {
        tracker.complete(loadStep, { imported: false });
      }
    
      const verificationStep = tracker.start('verification', 'Pré-vérification', 'Analyse initiale des calculs et garde-fous');
      const preliminaryVerification = await this.deps.verificationService.performPreliminaryVerification(
        params.thought,
        !!params.containsCalculations
      );
      tracker.complete(verificationStep, {
        detectedCalculations: preliminaryVerification.verifiedCalculations?.length || 0,
        initialVerification: preliminaryVerification.initialVerification
      });
    
      const graphStep = tracker.start('graph', 'Insertion de la pensée', 'Ajout de la pensée dans le graphe');
      const thoughtId = thoughtGraph.addThought(
        preliminaryVerification.preverifiedThought,
        params.thoughtType ?? 'regular',
        params.connections ?? []
      );
      tracker.complete(graphStep, { thoughtId, connectionCount: params.connections?.length ?? 0 });
    
      const evaluationStep = tracker.start('evaluation', 'Évaluation heuristique', 'Calcul des métriques locales', [graphStep]);
      const metrics: ThoughtMetrics = await this.deps.qualityEvaluator.evaluate(thoughtId, thoughtGraph);
      thoughtGraph.updateThoughtMetrics(thoughtId, metrics);
      tracker.complete(evaluationStep, {
        confidence: metrics.confidence,
        relevance: metrics.relevance,
        quality: metrics.quality
      });
    
      const heuristics = this.buildHeuristicTraces(thoughtId, metrics);
      const heuristicsJustification: ReasoningJustification = {
        summary: `Heuristiques calculées (confiance ${this.formatScore(metrics.confidence)}, pertinence ${this.formatScore(metrics.relevance)}, qualité ${this.formatScore(metrics.quality)})`,
        heuristics,
        timestamp: new Date().toISOString()
      };
      tracker.addJustification(evaluationStep, heuristicsJustification);
    
      const currentThought = thoughtGraph.getThought(thoughtId);
      if (currentThought) {
        const existingJustifications = currentThought.reasoning?.justifications || [];
        currentThought.reasoning = {
          createdByStepId: evaluationStep,
          updatedAt: heuristicsJustification.timestamp,
          justifications: [...existingJustifications, heuristicsJustification],
          heuristicWeights: heuristics
        };
      }
      this.decorateConnections(thoughtGraph, thoughtId, params.connections ?? [], heuristics, evaluationStep);
    
      const response: SmartThinkingResponse = {
        thoughtId,
        thought: preliminaryVerification.preverifiedThought,
        thoughtType: params.thoughtType ?? 'regular',
        qualityMetrics: metrics,
        sessionId,
        isVerified: preliminaryVerification.initialVerification,
        verificationStatus: preliminaryVerification.verificationInProgress
          ? 'verification_in_progress'
          : preliminaryVerification.initialVerification
            ? 'partially_verified'
            : 'unverified',
        certaintySummary: preliminaryVerification.verificationInProgress
          ? 'Vérification des calculs en cours...'
          : `Information ${preliminaryVerification.initialVerification ? 'partiellement vérifiée' : 'non vérifiée'}, niveau de confiance: ${Math.round(metrics.confidence * 100)}%.`,
        reliabilityScore: this.deps.metricsCalculator.calculateReliabilityScore(
          metrics,
          preliminaryVerification.initialVerification ? 'partially_verified' : 'unverified',
          preliminaryVerification.verifiedCalculations,
          undefined
        )
      };
    
      if (preliminaryVerification.verifiedCalculations?.length) {
        response.verification = {
          status: 'partially_verified',
          confidence: metrics.confidence,
          sources: ['Vérification interne des calculs'],
          verificationSteps: ['Annotation automatique des calculs détectés'],
          verifiedCalculations: preliminaryVerification.verifiedCalculations
        } as VerificationResult;
        response.isVerified = true;
        response.verificationStatus = 'partially_verified';
        response.certaintySummary = `Calculs vérifiés automatiquement (${preliminaryVerification.verifiedCalculations.length}). Niveau de confiance: ${Math.round(metrics.confidence * 100)}%.`;
      }
    
      const previousVerificationStep = tracker.start('verification', 'Recherche de vérifications antérieures', 'Consultation de la mémoire de vérification', [evaluationStep]);
      const connectedIds = (params.connections ?? []).map(conn => conn.targetId);
      const previousVerification = await this.deps.verificationService.checkPreviousVerification(
        currentThought?.content || params.thought,
        sessionId,
        params.thoughtType ?? 'regular',
        connectedIds
      );
      tracker.complete(previousVerificationStep, {
        previousMatch: !!previousVerification.previousVerification,
        similarity: previousVerification.previousVerification?.similarity
      });
    
      if (previousVerification.previousVerification) {
        response.isVerified = previousVerification.isVerified;
        response.verificationStatus = previousVerification.verificationStatus;
        response.certaintySummary = previousVerification.certaintySummary;
        response.verification = previousVerification.verification;
        response.reliabilityScore = this.deps.metricsCalculator.calculateReliabilityScore(
          metrics,
          previousVerification.verificationStatus as VerificationStatus,
          preliminaryVerification.verifiedCalculations,
          response.reliabilityScore
        );
        if (currentThought) {
          currentThought.metadata.previousVerification = {
            similarity: previousVerification.previousVerification.similarity,
            status: previousVerification.previousVerification.status,
            confidence: previousVerification.previousVerification.confidence,
            timestamp: previousVerification.previousVerification.timestamp
          };
        }
      }
    
      const needsDeepVerification = (metrics.confidence < VerificationConfig.CONFIDENCE.VERIFICATION_REQUIRED || params.requestVerification) && !previousVerification.previousVerification;
      if (needsDeepVerification && currentThought) {
        const deepVerificationStep = tracker.start('verification', 'Vérification approfondie', 'Lancement d’une vérification complète', [previousVerificationStep]);
        try {
          const verification = await this.deps.verificationService.deepVerify(
            currentThought,
            params.containsCalculations ?? false,
            false,
            sessionId
          );
          response.verification = verification;
          response.isVerified = ['verified', 'partially_verified'].includes(verification.status);
          response.verificationStatus = verification.status as VerificationDetailedStatus;
          response.reliabilityScore = this.deps.metricsCalculator.calculateReliabilityScore(
            metrics,
            verification.status as VerificationStatus,
            verification.verifiedCalculations,
            response.reliabilityScore
          );
          response.certaintySummary = this.deps.metricsCalculator.generateCertaintySummary(
            verification.status as VerificationStatus,
            response.reliabilityScore
          );
          if (verification.verifiedCalculations?.length) {
            response.thought = this.deps.verificationService.annotateThoughtWithVerifications(
              response.thought,
              verification.verifiedCalculations
            );
            thoughtGraph.updateThoughtContent(thoughtId, response.thought);
          }
          tracker.complete(deepVerificationStep, {
            status: verification.status,
            verifiedCalculations: verification.verifiedCalculations?.length || 0
          });
        } catch (error) {
          tracker.fail(deepVerificationStep, error);
          response.verificationStatus = 'inconclusive';
          response.certaintySummary = `Erreur lors de la vérification: ${error instanceof Error ? error.message : 'Erreur inconnue'}. Niveau de confiance: ${Math.round(metrics.confidence * 100)}%.`;
        }
      }
    
      if (params.suggestTools) {
        const toolStep = tracker.start('suggestion', 'Suggestion d’outils', 'Identification des outils pertinents', [evaluationStep]);
        response.suggestedTools = await this.deps.toolIntegrator.suggestTools(params.thought);
        tracker.complete(toolStep, { suggestions: response.suggestedTools.length });
      }
    
      if (params.generateVisualization) {
        const visualizationStep = tracker.start('visualization', 'Visualisation du graphe', 'Construction des vues demandées', [graphStep]);
        try {
          response.visualization = await this.generateVisualization(thoughtGraph, thoughtId, params);
          tracker.complete(visualizationStep, {
            nodeCount: response.visualization?.nodes.length || 0,
            linkCount: response.visualization?.links.length || 0
          });
        } catch (error) {
          tracker.fail(visualizationStep, error);
        }
      }
    
      const memoryStep = tracker.start('memory', 'Mémorisation', 'Mise à jour de la mémoire persistante', [evaluationStep]);
      const tags = params.thought
        .toLowerCase()
        .split(/\W+/)
        .filter(word => word.length > 4)
        .slice(0, 5);
      await Promise.resolve(this.deps.memoryManager.addMemory(response.thought, tags, sessionId));
      response.relevantMemories = await this.deps.memoryManager.getRelevantMemories(params.thought, 3, sessionId);
      tracker.complete(memoryStep, { storedTags: tags.length, relevantMemories: response.relevantMemories.length });
    
      const suggestionStep = tracker.start('planning', 'Prochaines étapes', 'Génération de suggestions de raisonnement', [evaluationStep]);
      response.suggestedNextSteps = await thoughtGraph.suggestNextSteps(3, sessionId);
      tracker.complete(suggestionStep, { suggestions: response.suggestedNextSteps.length });
    
      const persistenceStep = tracker.start('persistence', 'Sauvegarde du graphe', 'Persistances des données de session', [graphStep]);
      const graphState = thoughtGraph.exportEnrichedGraph();
      await this.deps.memoryManager.saveGraphState(sessionId, graphState);
      tracker.complete(persistenceStep, { persisted: true });
    
      response.reasoningTrace = tracker.getSteps();
      response.reasoningTimeline = tracker.getTimeline().map(item => ({
        stepId: item.stepId,
        label: item.label,
        status: item.status,
        timestamp: item.timestamp
      }));
    
      return { response, sessionId, thoughtGraph };
  • Registers the 'smartthinking' MCP tool on the server with name 'smartthinking', input schema, and handler that delegates to ReasoningOrchestrator.run().
    function createSmartThinkingTool(server: McpServer, env: SmartThinkingEnvironment): void {
      server.tool(
        'smartthinking',
        SmartThinkingParamsSchema.shape,
        async (params: SmartThinkingParams) => {
          if (params.help && !params.thought) {
            return {
              content: [
                {
                  type: 'text',
                  text: `# Smart-Thinking - Guide d'utilisation
    
    Smart-Thinking est un outil de raisonnement multi-dimensionnel qui organise les pensées en graphe plutôt qu'en séquence linéaire, permettant une analyse plus riche et interconnectée des problèmes complexes.
    
    ## Paramètres principaux
    - thought (obligatoire) : pensée à analyser
    - thoughtType : regular | revision | meta | hypothesis | conclusion
    - connections : [{ targetId, type, strength }]
    - requestSuggestions : activer les recommandations
    - generateVisualization : produire un graphe
    - requestVerification : lancer une vérification explicite
    - containsCalculations : vérifier les calculs mathématiques
    
    ## Types de visualisation
    - graph, chronological, thematic, hierarchical, force, radial
    
    ## Exemple d'utilisation
    thought: "L'intelligence artificielle transformera le marché du travail"
    thoughtType: "hypothesis"
    generateVisualization: true`
                }
              ]
            };
          }
    
          if (!params.thought) {
            return {
              isError: true,
              content: [
                {
                  type: 'text',
                  text: JSON.stringify({
                    error: "Le paramètre 'thought' est obligatoire.",
                    message: "Vous devez fournir une pensée à analyser."
                  }, null, 2)
                }
              ]
            };
          }
    
          const { response, sessionId } = await env.orchestrator.run(params);
          const payload: SmartThinkingResponse & { sessionId?: string } = {
            ...response,
            sessionId
          };
    
          return {
            content: [
              {
                type: 'text',
                text: JSON.stringify(payload, null, 2)
              }
            ],
            structuredContent: payload as unknown as Record<string, unknown>
          };
        }
      );
  • Zod input schema (SmartThinkingParamsSchema) defining all parameters for the smartthinking tool, including enums for types, options for visualization, verification, etc.
    export const SmartThinkingParamsSchema = z.object({
      thought: z.string().describe('Le contenu de la pensée à analyser - PARAMÈTRE OBLIGATOIRE'),
      thoughtType: ThoughtTypeEnum.default('regular').describe('Type de pensée dans le graphe de raisonnement'),
      connections: z.array(ConnectionSchema).default([]).describe('Connexions à d\'autres pensées'),
      requestSuggestions: z.boolean().default(false).describe('Demander des suggestions d\'amélioration du raisonnement'),
      generateVisualization: z.boolean().default(false).describe('Générer une visualisation du graphe de pensée'),
      visualizationType: VisualizationTypeEnum.default('graph').describe('Type de visualisation à générer'),
      suggestTools: z.boolean().default(true).describe('Suggérer des outils MCP pertinents pour cette étape du raisonnement'),
      sessionId: z.string().optional().describe('Identifiant de session pour maintenir l\'état'),
      userId: z.string().optional().describe('Identifiant de l\'utilisateur pour la personnalisation'),
      help: z.boolean().default(true).describe('Afficher le guide d\'utilisation complet'),
      requestVerification: z.boolean().default(false).describe('Demander explicitement une vérification des informations'),
      containsCalculations: z.boolean().default(false).describe('Indique si la pensée contient des calculs à vérifier'),
      visualizationOptions: VisualizationOptionsSchema.describe('Options avancées pour la visualisation')
    });
  • Main server creation function that conditionally registers the smartthinking tool via createSmartThinkingTool.
    export function createSmartThinkingServer(
      env?: SmartThinkingEnvironment,
      options?: SmartThinkingServerOptions
    ): { server: McpServer; env: SmartThinkingEnvironment } {
      const environment = env ?? getSmartThinkingEnvironment();
      const server = new McpServer({
        name: 'smart-thinking-mcp',
        version: environment.version
      }, { capabilities: {} });
    
      const { includeSmartThinkingTool = true } = options ?? {};
    
      if (includeSmartThinkingTool) {
        createSmartThinkingTool(server, environment);
      }
      createSearchTool(server, environment);
      createFetchTool(server, environment);
    
      return { server, env: environment };
    }
Behavior1/5

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

Tool has no description.

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

Conciseness1/5

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

Tool has no description.

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

Completeness1/5

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

Tool has no description.

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

Parameters1/5

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

Tool has no description.

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

Purpose1/5

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

Tool has no description.

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

Usage Guidelines1/5

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

Tool has no description.

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

Related 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/Leghis/Smart-Thinking'

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