---
title: Metadata annotation
description: Use the @Node.Metadata annotation to specify outcome providers, configuration classes, validators, and tags for authentication nodes in PingAM
component: pingam
version: 7.5
page_id: pingam:auth-nodes:core-metadata
canonical_url: https://docs.pingidentity.com/pingam/8.1/auth-nodes/core-metadata.html
llms_txt: https://docs.pingidentity.com/pingam/llms.txt
docs_for_agents: https://developer.pingidentity.com/build-with-ai/docs-for-agents.md
keywords: ["Extensibility", "Nodes &amp; Trees", "Scripts"]
superseded_by: https://docs.pingidentity.com/pingam/8.1/auth-nodes/core-metadata.html
---

# Metadata annotation

The *annotation* specifies two required attributes: the `outcomeProvider` and the `configClass`. Typically, the `configClass` attribute is an inner interface in the node implementation class.

Optionally, you can also specify a class as a `configValidator`, and `tags` to categorize the node type for display in the UI.

* `outcomeProvider`

  The class that defines the possible outcomes.

  The abstract implementations of the node interface, `org.forgerock.openam.auth.node.api.SingleOutcomeNode` and `org.forgerock.openam.auth.node.api.AbstractDecisionNode`, define outcome providers you can use for simple use cases. Provide your own implementation for more complex use cases.

  For example, the following is the custom outcome provider from the [LDAP Decision node](https://docs.pingidentity.com/auth-node-ref/7.5/ldap-decision.html), which has `True`, `False`, `Locked`, `Cancelled`, and `Expired` exit paths:

  ```java
  /**
  * Defines the possible outcomes from this Ldap node.
  */
  public static class LdapOutcomeProvider implements OutcomeProvider {
    @Override
    public List<Outcome> getOutcomes(PreferredLocales locales, JsonValue nodeAttributes) {
      ResourceBundle bundle = locales.getBundleInPreferredLocale(LdapDecisionNode.BUNDLE,
      LdapOutcomeProvider.class.getClassLoader());
      return ImmutableList.of(
        new Outcome(LdapOutcome.TRUE.name(), bundle.getString("trueOutcome")),
        new Outcome(LdapOutcome.FALSE.name(), bundle.getString("falseOutcome")),
        new Outcome(LdapOutcome.LOCKED.name(), bundle.getString("lockedOutcome")),
        new Outcome(LdapOutcome.CANCELLED.name(), bundle.getString("cancelledOutcome")),
        new Outcome(LdapOutcome.EXPIRED.name(), bundle.getString("expiredOutcome")));
    }
  }
  ```

* `configClass`

  The class name that contains the configuration of any attributes requested by the node when using it as part of a tree.

  For more information, See [Config interface](core-config.html).

* `configValidator`

  An optional class name used to validate the provided configuration.

* `tags`

  An optional list of tags to categorize the node within the tree designer view.

  Tags are made up of one or more text strings that let users find the node more easily when designing trees. For example, you could include common pseudonyms for the functionality the node provides, such as `mfa` for a node that provides multi-factor authentication functionality.

  The tree designer view organizes nodes into a number of categories, based on the presence of certain tag values, as described in the table below:

  **Authentication node tag categories**

  | Category             | Tag                      | Example nodes                                                                                                                                                                                                                       |
  | -------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | Basic Authentication | `"basic authentication"` | [Data Store Decision node](https://docs.pingidentity.com/auth-node-ref/7.5/data-store-decision.html) [Username Collector node](https://docs.pingidentity.com/auth-node-ref/7.5/am-only/username-collector.html)                     |
  | MFA                  | `"mfa"`                  | [Push Sender node](https://docs.pingidentity.com/auth-node-ref/7.5/push-sender.html) [WebAuthn Authentication node](https://docs.pingidentity.com/auth-node-ref/7.5/webauthn-authentication.html)                                   |
  | Risk                 | `"risk"`                 | [Account Lockout node](https://docs.pingidentity.com/auth-node-ref/7.5/account-lockout.html) [Auth Level Decision node](https://docs.pingidentity.com/auth-node-ref/7.5/auth-level-decision.html)                                   |
  | Behavioral           | `"behavioral"`           | [Increment Login Count node](https://docs.pingidentity.com/auth-node-ref/7.5/increment-login-count.html) [Login Count Decision node](https://docs.pingidentity.com/auth-node-ref/7.5/login-count-decision.html)                     |
  | Contextual           | `"contextual"`           | [Cookie Presence Decision node](https://docs.pingidentity.com/auth-node-ref/7.5/cookie-presence-decision.html) [Set Persistent Cookie node](https://docs.pingidentity.com/auth-node-ref/7.5/set-persistent-cookie.html)             |
  | Federation           | `"federation"`           | [OAuth 2.0 node](https://docs.pingidentity.com/auth-node-ref/7.5/am-only/oauth2.html) [OpenID Connect node](https://docs.pingidentity.com/auth-node-ref/7.5/am-only/oidc.html)                                                      |
  | Identity Management  | `"identity management"`  | [Anonymous User Mapping node](https://docs.pingidentity.com/auth-node-ref/7.5/anonymous-user-mapping.html) [Terms and Conditions Decision node](https://docs.pingidentity.com/auth-node-ref/7.5/terms-and-conditions-decision.html) |
  | Utilities            | `"utilities"`            | [Choice Collector node](https://docs.pingidentity.com/auth-node-ref/7.5/choice-collector.html) [Scripted Decision node](https://docs.pingidentity.com/auth-node-ref/7.5/scripted-decision.html)                                     |

  |   |                                                                                                               |
  | - | ------------------------------------------------------------------------------------------------------------- |
  |   | Nodes that aren't tagged with one of these tags appear in an **[icon: square, set=fa]Uncategorized** section. |

For example, the `@Node.Metadata` annotation for [Timer Start node](https://docs.pingidentity.com/auth-node-ref/7.5/timer-start.html) places it in the Utilities section:

```java
@Node.Metadata(outcomeProvider = SingleOutcomeNode.OutcomeProvider.class,
        configClass = TimerStartNode.Config.class,
        tags = {"metrics", "utilities"})
```

For more information on the `@Node.Metadata` annotation, see the [Node.Metadata](../_attachments/apidocs/org/forgerock/openam/auth/node/api/Node.Metadata.html) annotation type in the *AM Public API Javadoc*.
